首页 文章

Symfony2通过Web服务对用户进行身份验证

提问于
浏览
5

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

我尝试针对Web服务对用户进行身份验证 . 要对用户进行身份验证,我必须向webservice提供用户名和密码 .

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

以下是我遇到的问题的类似问题:Symfony2 authentication without UserProvider

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

2 回答

  • 0

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

    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->request->get('password');

  • 2

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

    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;
    }
    

相关问题