我在获取已登录用户的角色时遇到问题。我试图覆盖SecurityController并拥有以下代码:
public function loginAction(Request $request)
{
$userManager = $this->get('fos_user.user_manager');
$userId = $this->get('security.context')->getToken()->getUser()->getId();
$user = $userManager->findUserBy(array('id'=>$userId));
if( $user->hasRole('ROLE_ADMIN') && $this->get('security.context')->isGranted('IS_AUTHENTICATED_ANONYMOUSLY') ){
return new RedirectResponse($this->generateUrl('adminpage'));
}
if($user->hasRole('ROLE_ACCOUNTING') && $this->get('security.context')->isGranted('IS_AUTHENTICATED_ANONYMOUSLY') ){
return new RedirectResponse($this->generateUrl('accountingpage'));
}
....
这里的问题是getId()会抛出一个错误:
错误:在字符串
上调用成员函数getId()
我使用以下代码尝试了另一种方法:
if($this->get('security.context')->isGranted('ROLE_ADMIN') && $this->get('security.context')->isGranted('IS_AUTHENTICATED_ANONYMOUSLY') ){
return new RedirectResponse($this->generateUrl('adminpage'));
}
if($this->get('security.context')->isGranted('ROLE_ACCOUNTING') && $this->get('security.context')->isGranted('IS_AUTHENTICATED_ANONYMOUSLY') ){
return new RedirectResponse($this->generateUrl('accountingpage'));
}
但它总是评估为ROLE_ADMIN,即使我使用ROLE_ACCOUNTING登录用户,从而给我一个拒绝访问的消息。
我该如何解决这个问题?
非常感谢!
PS。我使用了Symfony 2.7
答案 0 :(得分:0)
您可以尝试以下操作:
$user= $this->get('security.context')->getToken()->getUser();
$userId = $user->getId();
或
$user = $this->getUser();
$userId = $user->getId();
或使用FOSUserBundle
$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserByUsername($this->container
->get('security.context')->getToken()->getUser());
$userId = $user->getId();
然后进行角色检查。
你得到的错误,你得到一个字符串而不是一个对象,是因为基类User类有一个__toString()
方法,它返回用户名。
有关类似问题,请参阅此回答https://stackoverflow.com/a/12663880/5043552。
同样不建议您使用->hasRole()
进行首次检查,请参阅以下FOSUserBundle
用户模型的摘录
/**
* Never use this to check if this user has access to anything!
*
* Use the SecurityContext, or an implementation of AccessDecisionManager
* instead, e.g.
*
* $securityContext->isGranted('ROLE_USER');
*
*/
public function hasRole($role)
你的第二个角色检查应该可以正常工作。