3

我有一个控制器操作(控制器已通过 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()我的 Controller ( )中的 Token 的字符串表示形式和 in 中的一个RoleVoter.php是相同的,但是当我使用 时$token->getRoles(),我得到了两个不同的数组。

我的用户和角色通过用户和角色实体存储在数据库中。这是我发现的错误还是我做错了什么?

4

2 回答 2

4

终于明白了。一分钟前,一个模糊的想法出现在我的脑海中。问题是我自己的RoleHierarchyInterface实现引起的。我最初的想法是复制 Symfony 自己的,但从 ORM 而不是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 的分析器中但isGranted返回 false - 可能发生在角色名称不以前缀ROLE_ 开头时。

错误的角色名称:USER_TYPE_ADMIN

正确的角色名称:ROLE_USER_TYPE_ADMIN

于 2014-08-29T07:30:20.643 回答