2012-11-14 17 views
8

AÇIKLAMAgeçiş izin ver/kullanıcı başka bir kullanıcıya geçmek için izin Symfony2'de

özellikle kullanıcılar tarafından taklit Symfony2'deki kolaydır. Sorum şu; belirli kullanıcıların yalnızca diğer kullanıcılara geçmesine nasıl izin veriliyor? Kullanıcı sağlayıcım olarak FOSUserBundle kullanıyorum.

ÖRNEK

Orada 5 kullanıcıları UserA, UserB UserC, UserD, UserE, ama sadece 3 tanesi birbirine bağlanmıştır.

UserA

UserB UserA ve UserC

geçebilirsiniz userB ve UserC

geçebilirsiniz UserC UserA ve UserB

için yardımınızı

Teşekkür geçiş yapabilirsiniz! Eğer Düzenli kullanıcıya Yönetici Kullanıcıları kimliğine bürünmek istiyorsanız

cevap

14

Muhtemelen varsayılan SwitchUserListener geçersiz kılarak bu tür bir şey uygulamak.

geçersiz kılmak olur parametredir: Örneğin security.authentication.switchuser_listener.class

, parameters.yml içinde:

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

Nerede, özel dinleyici sınıfında, Symfony\Component\Security\Http\Firewall\ListenerInterface uygulamak ve mevcut sınıfını kullanırsınız özel uygulamanız için bir temel olarak. Veonik, bir (belki kirli) yolu

+0

Bir çekicilik gibi çalışır. Teşekkürler! –

2
+0

, o/o ekleyebilirsiniz? _switch_user = anyusernamethatexists varsa söyle ve o kullanıcıya geçebilir. Kullanıcının sadece diğer kullanıcılara geçmesine nasıl izin verilir? –

+0

Sanırım bazı anahtar kullanıcı dinleyicisi var. Symfony kaynağını kontrol edeceğim. –

+0

Henüz kaynağı kontrol ettiniz mi? Yardım için teşekkürler! –

0

Teşekkür

o söz dizimi ile bir rol ekleyin bunu:

ROLE_ALLOWED_TO_SWITCH_{usertype} 

Örneğin userA için ROLE_A ekleyin:

ROLE_A: 
- ROLE_ALLOWED_TO_SWITCH_USERTYPEB 
- ROLE_ALLOWED_TO_SWITCH_USERTYPEC 

beyan YML kendi SwitchUserListener hizmeti:

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 
SwitchUserListener :: attemptSwitchUser yönteminde

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

Eğer url başka bir çözüm Anlıyorum gibi kullanıcı ROLE_ALLOWED_TO_SWITCH geçtiği zaman ++

İlgili konular