2012-11-14 11 views
8

WYJAŚNIENIEumożliwiają przełączanie/podszywanie się tylko do poszczególnych użytkowników w Symfony2

Umożliwienie użytkownikowi przełączanie do innego użytkownika jest łatwy w Symfony2. Moje pytanie brzmi: jak zezwolić niektórym użytkownikom na przełączanie się tylko do niektórych innych użytkowników? Używam FOSUserBundle jako dostawca moich użytkowników.

Przykład

Istnieje 5 użytkowników UserA, userB, UserC, userD, UserE, tylko trzy z nich są połączone ze sobą.

UserA może przełączyć się UserB i UserC

UserB może przełączyć się UserA i UserC

UserC może przełączyć się UserA i UserB

dzięki za pomoc!

Odpowiedz

14

Można ewentualnie wdrożenia tego typu rzeczy poprzez nadpisanie domyślnego SwitchUserListener.

Parametr byłoby zastąpić to: security.authentication.switchuser_listener.class

Na przykład w parameters.yml:

parameters: 
    security.authentication.switchuser_listener.class: My\Project\Security\Listener\SwitchUserListener 

Jeżeli w niestandardowej klasy słuchacza, to by realizować Symfony\Component\Security\Http\Firewall\ListenerInterface i wykorzystać istniejącą klasę jako podstawa niestandardowej implementacji.

+0

Działa jak urok. Dzięki! –

2

Jeśli chcesz podszywać Administrator Użytkownicy w regularnym użytkownikiem istnieje kilka przykładów :)

https://gist.github.com/1589120

http://symfony.com/doc/current/book/security.html#impersonating-a-user

+0

Jak rozumiem, gdy użytkownik ma ROLE_ALLOWED_TO_SWITCH, on/ona może dołączyć? _switch_user = anyusernamethatexists do URL-i może się przełączyć na tego użytkownika. Jak zezwolić użytkownikowi na przełączanie tylko do niektórych innych użytkowników? –

+0

Przypuszczam, że jest tam jakiś przełącznik nasłuchujący użytkownika. Sprawdzę źródło symfony. –

+0

Czy sprawdziłeś już źródło? Dzięki za pomoc! –

0

Dzięki Veonik, a (może brudnej) sposób to zrobić

Dodaj rolę w tej składni:

ROLE_ALLOWED_TO_SWITCH_{usertype} 

Na przykład dodać ROLE_A do Usera:

ROLE_A: 
- ROLE_ALLOWED_TO_SWITCH_USERTYPEB 
- ROLE_ALLOWED_TO_SWITCH_USERTYPEC 

Declare własna usługa SwitchUserListener w yml:

security.authentication.switchuser_listener: 
    class: %security.authentication.switchuser_listener.class% 
    public: false 
    abstract: true 
    tags: 
     - { name: monolog.logger, channel: security} 
    arguments: 
    - @security.context 
    - null 
    - @security.user_checker 
    - null 
    - @security.access.decision_manager 
    - @logger 
    - _switch_user 
    - ROLE_ALLOWED_TO_SWITCH 
    - @event_dispatcher 
    - @security.role_hierarchy 

W metodzie SwitchUserListener :: attemptSwitchUser

private function attemptSwitchUser(Request $request) 
{ 
.... 
CODE BEFORE 
.... 
    $user = $this->provider->loadUserByUsername($username); 
    $rtoSwith = $this->getRolesToSwitchTo($token->getRoles()); 
    $accessGranted = false; 
    foreach ($rtoSwith as $suType) { 
     $instance = ucfirst(strtolower($suType)); 
     if ($user instanceof $instance) { 
      $accessGranted = true; 
      break; 
     } 
    } 

    if (!$accessGranted) { 

     throw new AccessDeniedException('Access Denied, not allowed to switch to type : '.get_class($user)); 
    } 
.... 
CODE AFTER 
.... 
return $token 
} 

protected function getRolesToSwitchTo($roles){ 

    $rts = array(); 
    foreach ($this->roleHierarchy->getReachableRoles($roles) as $role) { 

     $tmp = explode("ROLE_ALLOWED_TO_SWITCH_", $role->getRole()); 

     if(isset($tmp[1])){ 
      $rts[] = $tmp[1]; 
     } 
    } 

    return $rts; 
} 

Powiedz mi, czy masz inne rozwiązanie ++

Powiązane problemy