2017-04-12 56 views
0

我一直當他登錄的動態角色設置爲用戶,所以我創建了一個服務LoginSuccessHanlder與成功登錄該功能:不能檢查,如果一個角色被授予

public function onAuthenticationSuccess(Request $request, TokenInterface $token) { 
    $response = null; 

    $user = $this->token->getToken()->getUser(); 
    $poste = $request->get('_poste'); 
    $user->addRole('ROLE_'.strtoupper($poste)); 
    $this->em->persist($user); 
    $this->em->flush(); 
    if ($this->authorizationChecker->isGranted('ROLE_USER')) { 
     $response = new RedirectResponse($this->router->generate('homepage')); 
     $response->headers->setCookie(new Cookie('poste', $poste)); 
    } 

    return $response; 
} 

所以在這裏,我通過登錄表單_poste 中的字段向用戶添加新角色。一旦我參與的登錄我應該能夠做到:

{% if is_granted("ROLE_FLEX") %} 
    message 
{% endif %} 

但沒有消息

但是,如果我這樣做:

{{ dump(app.user.roles) }} 

我有陣列的作用ROLE_FLEX ,爲什麼我不能用is_granted函數檢查角色?我錯過了什麼?

有關信息,我使用FOSUserBundle

編輯

我刪除的角色,每次用戶註銷,所以當他註銷用戶不具備ROLE_FLEX了,但作用會如果他在檢查日誌上這個角色添加基本上用戶必須爲每個會話

+0

你可以顯示'addRole'函數代碼嗎? –

+0

@ i.am.michiel'addRole'函數由FOSUserBundle –

+0

提供角色是否存在?在每個請求中,FOSUserBundle都會從數據庫(或任何您的提供者)重新加載用戶和角色。 –

回答

1

當你通過一個角色is_granted()功能所使用的Symfony的安全層的RoleVoter類讀取令牌,而不是用戶對象的角色。這意味着您必須相應地更新令牌。

+0

謝謝,這解決了我的問題!我使用[this](http:// stackoverflow。com/questions/19713802/symfony-2-3-how-do-i-refresh-the-authenticated-user-from-the-database)問題來刷新令牌 –

0

,我發現是創建自己的功能檢查,如果用戶有特定角色的解決方案的作用:

public function isGranted($role) 
{ 
    return in_array($role, $this->getRoles()); 
} 

現在我可以用{% if app.user.isGranted("ROLE_FLEX") %}

+1

只需記下您在執行此操作時繞過安全系統。如果你決定使用諸如選民之類的東西,那麼你會遇到麻煩。 – Cerad

+0

@Cerad我現在沒有找到其他解決方案,因爲我在用戶註銷時刪除角色 –