使用FOSUserBundle Symfony2登录后获取用户的ROLES

时间:2015-11-23 05:56:43

标签: php symfony fosuserbundle

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

1 个答案:

答案 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)

你的第二个角色检查应该可以正常工作。