2012-11-14 16 views
8

SPIEGAZIONEConsentire commutazione/impersonare solo a particolari utenti in Symfony2

Permettendo all'utente di passare a qualsiasi altro utente è facile in Symfony2. La mia domanda è, come consentire a determinati utenti di passare solo ad alcuni altri utenti? Sto usando FOSUserBundle come il mio fornitore di utenti.

ESEMPIO

C'è 5 utenti, UserA, UserB, UtenteC, userd, UserE, ma solo 3 dei quali sono collegati insieme.

UtenteA può passare a UtenteB e UtenteC

UserB possibile passare a UserA e UtenteC

UtenteC possibile passare a UtenteA e UtenteB

Grazie per il vostro aiuto!

risposta

14

Si potrebbe implementare questo tipo di cosa sovrascrivendo lo SwitchUserListener di default.

Il parametro si ignorare è: security.authentication.switchuser_listener.class

Per esempio, in parameters.yml:

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

Dove, nella classe listener personalizzato, devi implementare Symfony\Component\Security\Http\Firewall\ListenerInterface e utilizza la classe esistente come base per la tua implementazione personalizzata.

+0

Funziona come un incantesimo. Grazie! –

2

Se si vuole impersonare Admin utenti per utente normale ci sono alcuni esempi :)

https://gist.github.com/1589120

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

+0

quanto ho capito, una volta utente ha ROLE_ALLOWED_TO_SWITCH, lui/lei può aggiungere? _switch_user = anyusernamethatexists per l'url e è in grado di passare a quell'utente Come consentire all'utente di passare solo ad alcuni altri utenti? –

+0

Suppongo che ci sia qualcuno che ascolta il listener degli utenti. Controllerò la sorgente di symfony. –

+0

Hai già controllato la fonte? Grazie per l'aiuto! –

0

Grazie a Veonik, un modo (forse sporco) per farlo

Aggiungi un ruolo con questa sintassi:

ROLE_ALLOWED_TO_SWITCH_{usertype} 

Per esempio aggiungere ROLE_A a userA:

ROLE_A: 
- ROLE_ALLOWED_TO_SWITCH_USERTYPEB 
- ROLE_ALLOWED_TO_SWITCH_USERTYPEC 

Declare il proprio servizio SwitchUserListener in 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 

Nel metodo 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; 
} 

Dimmi se si dispone di un'altra soluzione ++

Problemi correlati