2016-07-05 18 views
1

Mit Symfony 3 verwende ich einen benutzerdefinierten Guard Authenticator, der korrekt funktioniert, um einen Benutzer direkt zu authentifizieren. Ich möchte jetzt den Benutzeridentitätswechsel unterstützen, aber wenn ich versuche, einen Benutzer mit dem Abfrageparameter _switch_user zu imitieren, ist das getUser() -Objekt immer der ursprüngliche Benutzer.Imitieren von Benutzern in Symfony beim Authentifizieren mit einem Guard

Meine Sicherheit config

security: 
 

 
    encoders: 
 
     Symfony\Component\Security\Core\User\User: plaintext 
 

 
    providers: 
 
     app: 
 
      entity: 
 
       class: AppBundle:Authentication 
 
       property: username 
 

 
    firewalls: 
 
     dev: 
 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
 
      security: false 
 

 
     main: 
 
      anonymous: ~ 
 
      switch_user: true 
 
      guard: 
 
       authenticators: 
 
        - app.authenticator 
 

 
    role_hierarchy: 
 
     ROLE_ADMIN:  ROLE_USER 
 
     ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 
 

 
    access_control: 
 
     - { path: ^/admin/, role: ROLE_ADMIN } 
 
     - { path: ^/, role: ROLE_USER } 
 
​

Mein Authenticator ist

class AppAuthenticator extends AbstractGuardAuthenticator 
 
{ 
 
    public function getCredentials(Request $request) 
 
    { 
 
     $username = $request->query->get('username'); 
 
     if (empty($username)) { 
 
      return; 
 
     } 
 

 
     return array(
 
\t \t  'username' => $username, 
 
     ); 
 
    } 
 

 
    public function getUser($credentials, UserProviderInterface $userProvider) 
 
    { 
 
     $username = $credentials['username']; 
 
     \t return $userProvider->loadUserByUsername($username); 
 
    } 
 

 
    public function checkCredentials($credentials, UserInterface $user) 
 
    { 
 
     return true; 
 
    } 
 

 
    public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) 
 
    { 
 
     return null; 
 
    } 
 

 
    public function onAuthenticationFailure(Request $request, AuthenticationException $exception) 
 
    { 
 
\t \t $data = array(
 
\t \t \t \t 'message' => strtr($exception->getMessageKey(), $exception->getMessageData()) 
 

 
\t \t \t \t // or to translate this message 
 
\t \t \t \t // $this->translator->trans($exception->getMessageKey(), $exception->getMessageData()) 
 
\t \t); 
 

 
\t \t return new JsonResponse($data, 403); 
 
    } 
 

 
    public function start(Request $request, AuthenticationException $authException = null) 
 
    { 
 
     return new RedirectResponse(
 
      ... 
 
      ) 
 
    } 
 

 
    public function supportsRememberMe() 
 
    { 
 
     return false; 
 
    } 
 

 
}

Es scheint, dass die GetCredentials() me Dieser Authenticator wird immer aufgerufen und ich kann keine Möglichkeit erkennen, den Identitätswechsel zu erkennen. Also, meine Frage ist, können Benutzer imitiert werden, wenn Guard-Authentifizierung verwendet wird und wenn ja, was fehlt mir?

Antwort

1

Ich habe einen Weg gefunden, dies zu tun, aber es verlässt sich nicht auf native switch_user System und hat Abhängigkeit mit Ihrer Anwendungslogik.

Das Prinzip basisch ist, setzt Sie Ihr eigenes Vermittlungssystem basiert auf zwei Eigenschaften auf der Benutzerklasse:

  • impersonate: einen String-Wert, der den Benutzernamen des Benutzers speichert imitierten werden
  • impersonatedBy: ein String-Wert, (kein db Speicher) der Benutzername des Benutzers, die Identitätswechsel

NB tun enthält: Sie kann den Benutzer auch in diesen Eigenschaften speichern (z. mit Lehre) abgebildet

Also, wenn Sie Ihre Wache Authenticator sagen für einen Benutzer (getUser) zu suchen, fragen Sie den UserProvider des Benutzers imitierte ein ($ user-> getImpersonate) zurückzukehren, um es dem Hinzufügen des Benutzers Das macht Identitätswechsel ($ impersonatedUser-> setImpersonatedBy).