2015-11-23 101 views
0
我有在得到已登錄的用戶的角色問題

我試圖重寫SecurityController並有下面的代碼:獲取用戶的角色與FOSUserBundle的Symfony2登錄後

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()拋出一個錯誤,像這樣:

Error: Call to a member function getId() on string

我試着像這樣用下面的代碼另一種方法:

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_ACCOUNTING登錄了一個用戶,它總是評估爲ROLE_ADMIN,從而給我一個Access Denied消息。

我該如何解決這個問題?

非常感謝!

PS。我用的Symfony 2.7

+0

什麼版本的symfony? –

回答

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) 

你的第二個角色檢查的用戶模型應該只是罰款。

相關問題