2012-08-21 1 views
3

컨트롤러 작업이 있습니다 (컨트롤러의 $this->securityContext$this->get('security.context')으로 설정 됨). JMSDiExtraBundle) : 나는 dev 환경에 로그인하여 프로파일을 검사 할 때

$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(); 
} 

, 나는 내가 ROLE_ADMIN 역할을 부여한 것을 볼 수 있습니다,하지만, 난 여전히 그룹의 필터링 된 목록을 얻을.

내 컨트롤러에 디버깅 코드를 넣었으며 Symfony의 RoleVoter.php을 넣었습니다. 내 컨트롤러의 토큰 문자열 표현 ($this->securityContext->getToken())과 RoleVoter.php의 문자 표현은 동일하지만, $token->getRoles()을 사용하면 두 개의 다른 배열을 얻습니다.

내 사용자 및 역할은 사용자 및 역할 엔티티를 통해 데이터베이스에 저장됩니다. 이 버그는 제가 발견 한 버그입니까, 아니면 제가 잘못하고있는 버그입니까?

답변

4

마지막으로 가져 왔습니다. 잠시 전에 내 마음이 희미 해졌다. 문제는 내 자신의 RoleHierarchyInterface 구현으로 인해 발생했습니다. 내 독창적 인 아이디어는 Symfony 자신을 복사하는 것이지만 security.yml 대신 ORM에서 불러 와야합니다. 그러나 이것 때문에 나는 buildRoleMap() 함수를 완전히 다시 써야했다. 다음과 같이 DIFF는 다음과 같습니다

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(); 
      } 
     } 
    } 
} 
+3

1 : – Khez

0

이 경우 - 역할 설정과 심포니의 프로파일에 표시되지만 거짓 isGranted 수익률이 - 역할 이름이 접두사 ROLE_로 시작하지 않을 때 발생 될 수있다.

나쁜 역할 이름 : USER_TYPE_ADMIN

올바른 역할 이름 : 당신의 문제를 해결하는 코드를 제공 ROLE_USER_TYPE_ADMIN

관련 문제