5

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

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

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

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

这几天我一直在为这个问题苦苦挣扎……

4

2 回答 2

2

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

服务.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');
}

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

于 2013-10-07T11:13:11.483 回答
0

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

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;
}
于 2013-09-27T05:55:13.427 回答