也许问题很简单,但现在是:
我使用自己的User类和UserProvider类进行了身份验证。我扩展了DefaultAuthenticationSuccessHandler
来修改连接的用户。
这应该发生在这个方法中:
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
在我的自定义类User中,我有一个addRole
方法。
如何从onAuthenticationSuccess
函数中作为参数提供的令牌中获取此方法?
答案 0 :(得分:0)
首先,您需要检索经过身份验证的用户:
$user = $token->getUser();
然后,您应该可以致电$user->addRole()
。
但是,您需要将更改存储在db中
为此,您需要在服务中注入原则EntityManager
。
更改服务声明:
# services.yml
your_authentication_success_handler:
# ...
arguments:
entityManager: "@doctrine.orm.entity_manager"
在服务的构造函数中设置entityManager
:
// Authentication success handler
public function __construct(\Doctrine\ORM\EntityManager $entityManager = null)
{
$this->_em = $entityManager;
}
现在,您可以使用onAuthenticationSuccess
方法更新用户,如下所示:
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
$user = $token->getUser();
$user->addRole('YOUR_ROLE');
$this->_em->flush();
}
<强>更新强>
由于返回的User
不是您的自定义User
实体的实例,因此您必须使用实体的Repository
检索它。
use YourBundle\Entity\User;
// ...
$user = $token->getUser();
if (!($tokenUser instanceof User) {
$repository = $this->_em->getRepository('YourBundle:User');
$user = $repository->findBy(array(
'username' => $tokenUser->getUsername(), // Assuming the 'username' property is unique
));
}
$user->addRole('YOUR_ROLE'); // Now you can access the method
$this->_em->flush();