2017-04-03 9 views
1

Bevor ich das Rad neu erfinde, möchte ich zuerst überprüfen, ob ZF2 entweder sofort oder mit einer 3rd-Party-Bibliothek diesen speziellen Anwendungsfall unterstützt, bei dem Admins log in as anderer Benutzer oder assume ihre Identität.ZF2 - Angenommen, die Identität eines anderen Benutzers

Wenn nicht, wie ich mit ZF2 internem Design nicht vertraut bin, wie würde ich in die Implementierung gehen, mit der einzigen Einschränkung, dass das System bereits gebaut ist, so kann ich nicht Komponenten (Controller, Auth-Dienste usw.), um es zu unterstützen.

Mein erster Gedanke wäre, einen Mechanismus zu machen, um die geloggten Benutzerinformationen, die im Sitzungsspeicher gespeichert sind, mit demjenigen auszutauschen, dessen Identität ich annehmen möchte. Schreiben Sie dann unter einem anderen Namespace die ursprüngliche Benutzerinformation (admin) in die Sitzung, damit sie zurückgesetzt werden kann.

Mit diesem Ansatz erwarte ich Komponenten wie Zend\Authentication\AuthenticationService den Benutzer, dessen Identität ich vermute. Also, in jedem Anruf, den ich an $this->identity()->getId() mache (Identität ist ein Controller-Plugin für AuthenticationService, das die User zurückgibt) in anderen Controllern, wird die Geschäftslogik normal funktionieren.

Nach diesen Worten würden die Fragen sein:

  1. Gibt es eine Lösung bereits für das?
  2. Ist meine Vorgehensweise richtig, wenn ich davon ausgehe, dass ich durch Überschreiben des Sitzungsspeichers eine andere Benutzerkennung annehmen und erwarten kann, dass ZF2-Komponenten entsprechend funktionieren, oder gibt es Überlegungen hinsichtlich des internen Designs/der Infrastruktur von ZF2, die ich nicht berücksichtigt habe ?
  3. Vielleicht gibt es einen besseren Weg, dies zu tun?

Antwort

1

Ich denke, Sie müssten Ihren eigenen AuthenticationAdaptor erstellen.

Die obige Klasse ermöglicht es Ihnen, sich als ein anderer Benutzer anzumelden, wenn Sie mit der Zend AuthenticationService-Klasse verwendet werden.

Sie benötigen eine Möglichkeit, Zends AuthenticationService-Klasse zu verwenden, und ich würde empfehlen, einen AuthManager zu verwenden, der den AuthenticationService umgibt.

/** 
* The AuthManager service is responsible for user's login/logout and simple access 
* filtering. The access filtering feature checks whether the current visitor 
* is allowed to see the given page or not. 
*/ 
class AuthManager 
{ 
    /** 
    * Authentication service. 
    * @var \Zend\Authentication\AuthenticationService 
    */ 
    private $authService; 

    /** 
    * Session manager. 
    * @var Zend\Session\SessionManager 
    */ 
    private $sessionManager; 

    /** 
    * Contents of the 'access_filter' config key. 
    * @var array 
    */ 
    private $config; 

    /** 
    * Constructs the service. 
    */ 
    public function __construct($authService, $sessionManager, $config) 
    { 
     $this->authService = $authService; 
     $this->sessionManager = $sessionManager; 
     $this->config = $config; 
    } 

    /** 
    * Performs a login attempt. If $rememberMe argument is true, it forces the session 
    * to last for one month (otherwise the session expires on one hour). 
    */ 
    public function login($email, $password, $rememberMe) 
    { 
     // Check if user has already logged in. If so, do not allow to log in 
     // twice. 
     if ($this->authService->getIdentity()!=null) { 
      throw new \Exception('Already logged in'); 
     } 

     // Authenticate with login/password. 
     $authAdapter = $this->authService->getAdapter(); 
     $authAdapter->setEmail($email); 
     $authAdapter->setPassword($password); 
     $result = $this->authService->authenticate(); 

     // If user wants to "remember him", we will make session to expire in 
     // one month. By default session expires in 1 hour (as specified in our 
     // config/global.php file). 
     if ($result->getCode()==Result::SUCCESS && $rememberMe) { 
      // Session cookie will expire in 1 month (30 days). 
      $this->sessionManager->rememberMe(60*60*24*30); 
     } 

     return $result; 
    } 

    public function loginAsUser($user) 
    { 
     // Check if user has already logged in. If so, do not allow to log in 
     // twice. 
     if ($this->authService->getIdentity() !== null) { 
      throw new \Exception('Not logged in.'); 
     } 

     // First need to logout of current user 
     $this->authService->clearIdentity(); 

     $authAdapter = $this->authService->setAdapter(new AdminUserLoginAsUser($user, $this->authService->getIdentity())); 
     return $this->authService->authenticate(); 

    } 

    /** 
    * Performs user logout. 
    */ 
    public function logout() 
    { 
     // Allow to log out only when user is logged in. 
     if ($this->authService->getIdentity()==null) { 
      throw new \Exception('The user is not logged in'); 
     } 

     // Remove identity from session. 
     $this->authService->clearIdentity(); 
    } 

} 

Um zu sehen, wie es stecken alle zusammen würde ich bei den folgenden Ressourcen suchen empfehlen:

Die Ressourcen sind für ZF3 aber ich denke, das Das Authentifizieren von Benutzern und das Verwalten der Authentifizierung ist sehr ähnlich zu zf2.

Verwandte Themen