使用FOSUserBundle Symfony2登录后获取用户的角色


Getting the ROLES of the user after logging in with FOSUserBundle Symfony2

我在获取登录用户的角色时遇到问题。我试图覆盖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)

你的第二个角色检查应该很好。