【问题标题】:Symfony2 authenticating users through a webserviceSymfony2 通过 web 服务对用户进行身份验证
【发布时间】:2013-02-23 00:36:30
【问题描述】:

我目前正在处理 Symfony2 的安全组件。

我尝试根据网络服务对用户进行身份验证。要对用户进行身份验证,我必须向 Web 服务提供用户名和密码。

我知道我必须创建一个实现 UserProvider 的类。但是 loadUserByUsername 函数不适合我的 web 服务需求:为了验证用户身份,它需要用户名和密码,而 UserProvider 的函数只需要用户名。

这是与我面临的问题类似的问题:Symfony2 authentication without UserProvider

我已经在这个问题上苦苦挣扎了几天......

【问题讨论】:

  • 我对链接问题的回答有帮助吗?还是只是让事情变得混乱?
  • 您使用的是哪种网络服务?密码是如何编码的?也许您必须按照symfony.com/doc/current/cookbook/security/… 中的描述创建一个身份验证提供程序……不过这需要做很多工作!查看stackoverflow.com/questions/14928514/… ..它应该可以帮助您入门。
  • 非常感谢您的回答!我会尝试像@hacfi 建议的here 那样做。
  • 我刚刚创建了以下类:令牌、侦听器和提供者。我被困在 AuthenticationProvider 的身份验证功能上。我要在这里调用 REST 网络服务吗?
  • 我帮助 Montgomery Jean 进行了设置。他的 repo 在 GitHub 上在线:github.com/freen/wordrot

标签: web-services security symfony symfony-2.1


【解决方案1】:

实现此目的的一种方法是通过用户名加载用户,然后验证密码。如果给定用户名的用户存在并且输入的密码与该用户的密码匹配,则验证该用户。 示例:

public function userLogin($username, $password)
{
    $em = $this->getEntityManager();
    $query = $em->createQuery('SELECT u FROM VenomCoreBundle:User u WHERE u.username = :username OR u.email = :username AND u.isDeleted <> 1 ')
            ->setParameter('username', $username);
    try {
        $entity = $query->getSingleResult();
        if (count($entity) > 0) {
            $encoder = new MessageDigestPasswordEncoder('sha512', true, 10);
            $passwordEnc = $encoder->encodePassword($password, $entity->getSalt());
            $userPassword = $entity->getPassword();

            if ($passwordEnc == $userPassword) {
                $tokenValue = $entity->getUserToken();
                $profile = $entity->getUserProfile();
                if(!$profile) {
                    return false;
                }
                $userName = $profile->getFullName();



                $response = array(
                    'token' => $tokenValue,
                    'username' => $userName
                );
            } else {
                return false;
            }
        }
    } catch (\Doctrine\Orm\NoResultException $e) {
        return false;
    }

    return $response;
}

【讨论】:

    【解决方案2】:

    我以这种方式解决了这个问题:

    services.yml:

    services:
         user_provider:
             class: "%my_class%"
             arguments: ["@service_container"]
    

    WebServiceUserProvider.php

    /**
     * @param ContainerInterface $container
     */
    public function __construct(ContainerInterface $container)
    {
        $this->apiClient = $container->get('api_client');
        $this->request = $container->get('request');
    }
    

    并在您的 loadUserByUsername 方法中使用 $password = $this-&gt;request-&gt;get('password');

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 2011-10-16
      • 1970-01-01
      • 2012-05-25
      • 2011-07-05
      • 2012-07-28
      相关资源
      最近更新 更多