我在获取登录用户的角色时遇到问题。我试图覆盖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
您可以尝试以下操作:
$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)
你的第二个角色检查应该很好。