3

Controller アクションがあります (Controller はJMSDiExtraBundle 経由で$this->securityContext設定されています):$this->get('security.context')

$user = $this->securityContext->getToken()->getUser();
$groupRepo = $this->getDoctrine()->getRepository('KekRozsakFrontBundle:Group');

if ($this->securityContext->isGranted('ROLE_ADMIN') === false) {
    $myGroups = $groupRepo->findByLeader($user);
} else {
    $myGroups = $groupRepo->findAll();
}

環境にログインしてdevプロファイラーを確認すると、ROLE_ADMINロールが付与されていることがわかりますが、フィルタリングされたグループのリストが表示されます。

Controller と Symfony のRoleVoter.php. コントローラー ( $this->securityContext->getToken())内のトークンの文字列表現と 内のトークンの文字列表現RoleVoter.phpは同じですが、 を使用する$token->getRoles()と、2 つの異なる配列が得られます。

マイ ユーザーとロールは、ユーザー エンティティとロール エンティティを介してデータベースに保存されます。これは私が見つけたバグですか、それとも何か間違っていますか?

4

2 に答える 2

4

最後にそれを手に入れました。1 分前にぼんやりとした考えが頭に浮かびました。問題は私自身のRoleHierarchyInterface実装が原因でした。私の最初のアイデアは、Symfony のものをコピーすることでしたが、security.yml. しかし、このため、buildRoleMap()関数を完全に書き直さなければなりませんでした。差分は次のとおりです。

 private function buildRoleMap()
 {
     $this->map = array();
     $roles = $this->roleRepo->findAll();
     foreach ($roles as $mainRole) {
         $main = $mainRole->getRole();
 -       $this->map[$main] = array();
 +       $this->map[$main] = array($main);
         foreach ($mainRole->getInheritedRoles() as $childRole) {
             $this->map[$main][] = $childRole->getRole();
             // TODO: This is one-level only. Get as deep as possible.
             // BEWARE OF RECURSIVE NESTING!
             foreach ($childRole->getInheritedRoles() as $grandchildRole) {
                 $this->map[$main][] = $grandchildRole->getRole();
             }
         }
     }
 }
于 2012-08-23T14:16:05.840 に答える
0

このケース - ロールが設定され、Symfony のプロファイラーに表示されますが、false を返します - ロール名がプレフィックスROLE_isGrantedで始まらない場合に発生する可能性があります。

ロール名が正しくありません:USER_TYPE_ADMIN

正しいロール名:ROLE_USER_TYPE_ADMIN

于 2014-08-29T07:30:20.643 に答える