我目前正在处理Symfony2的安全组件。
我尝试针对Web服务对用户进行身份验证。要对用户进行身份验证,我必须向webservice提供用户名和密码。
我知道我必须创建一个实现UserProvider的类。但是loadUserByUsername函数不符合我的web服务需求:为了验证用户,它要求用户名和密码,而UserProvider的函数只需要用户名。
以下是我遇到的问题的类似问题:Symfony2 authentication without UserProvider
我已经在这个问题上苦苦挣扎了几天......
答案 0 :(得分: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->request->get('password');
答案 1 :(得分: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;
}