2014-05-23 2 views
0

내 응용 프로그램의 사용자에게 동적 역할을 할당하려고했습니다. 나는 그것을하기 위해 이벤트 리스너를 사용하려했지만, 그 하나의 http 요청에 대한 동적 역할을 추가했다.symfony의 동적 역할

이것은 내 사용자 지정 이벤트 수신기에서 역할을 추가하는 기능입니다.

public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) { 

    $user = $this->security->getToken()->getUser(); 

    $role = new Role; 
    $role->setId('ROLE_NEW'); 
    $user->addRole($role); 
} 

그러나이 기능이 이벤트 리스너와도 가능하지는 않습니다. 사용자가 기록 된 전체 시간 동안 역할을 추가하는 좋은 방법을 찾아야합니다. 나는 어떤 도움이나 제안을 주셔서 감사합니다.

+0

당신은 세션 지속되는 역할 공급자를 만드는 시도 할 수 있습니다. –

답변

0

아직 테스트하지는 않았지만 요리 책을 읽으면 효과가 있습니다.

이 예는 귀하의 요구 사항을 충족시킬 수있는 요리 책의 예를 수정 한 것입니다.

class DynamicRoleRequestListener 
{ 
    public function __construct($session, $security) 
    { 
     $this->session = $session; 
     $this->security = $security; 
    } 

    public function onKernelRequest(GetResponseEvent $event) 
    { 
     if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) { 
      // don't do anything if it's not the master request 
      return; 
     } 

     if ($this->session->has('_is_dynamic_role_auth') && $this->session->get('_is_dynamic_role_auth') === true) { 
      $role = new Role("ROLE_NEW"); //I'm assuming this implements RoleInterface 
      $this->security->getRoles()[] = $role; //You might have to add credentials, too. 
      $this->security->getUser()->addRole($role); 
     } 

     // ... 
    } 

    private $session; 
    private $security; 
} 

그리고 서비스로 선언하십시오.

services: 
    kernel.listener.dynamicrolerequest: 
     class: Your\DemoBundle\EventListener\DynamicRoleRequestListener 
     arguments: [@session, @security.context] 
     tags: 
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 

비슷한 질문

은 여기에 있습니다 : how to add user roles dynamically upon login with symfony2 (and fosUserBundle)?

+0

고마워, 할 수있는 좋은 방법. 하지만 한 가지 문제가 있습니다. "onKernelRequest"함수는 페이지가로드 될 때 CSS 스타일 시트없이로드된다는 사실을 제외하고는 잘 작동합니다. 그것은 사용자를 얻으려고 시도하여 발생하는 것 같습니다. 그것을 해결하는 방법을 알고 있습니까? –

+0

캐시를 지우려고 했습니까? –

+0

이제 청소하고 작동합니다. :) 고마워. –