1

Ich schreibe den authentication Prozess für meine Anwendung neu unter ZF2.Zend Framework 2 - Überprüfen auf Authentifizierung in abstrakten Controller -> onDispatch?

Ich muss mehr Optionen haben, um den Benutzer abhängig vom aufgerufenen Dienst zu authentifizieren.

I.E. Für Webanwendungen, auf die ich vom Browser aus zugreife, werde ich mich über Ldap authentifizieren und für API-Dienste werde ich die Benutzeranmeldeinformationen in der Kopfzeile überprüfen.

Ich erstellte eine abstract controller Überprüfung, ob der Benutzer authentifiziert ist; Wenn nicht, wird es zur Anmeldeseite umgeleitet.

Alle Controller in den Modulen, die denselben Authentifizierungsprozess benötigen, erweitern diese Klasse.

Ich muss die ursprüngliche Anfrage speichern, um es nach erfolgreicher Anmeldung zurück zu es umleiten.

Meine Fragen sind:

1. die abstrakte Controller Ist -> onDispatch() Methode die richtige Ort, es zu platzieren?

Jede Lösung fand ich immer in der Module.php. Um die Authentifizierungsmethode zu unterscheiden, müssen sie überprüfen, ob der angeforderte Controller übereinstimmt, da Module.php immer aufgerufen wird. Ist es nicht "sauberer", es im Controller zu setzen?

2. Sollte ich Redirect oder Forward verwenden, um vom ursprünglichen Controller zum Login Controller und dann zurück zu gelangen?

Ich habe nichts dagegen, dass die URL in der Browserleiste ändert, nur auf der Suche nach der besten und schnellsten Lösung, die auch ursprüngliche Anfrage hält.

3. Ist es richtig, die uri in der Sitzungsklasse zu speichern (aus dem Auth-Modul)? Gibt es eine Möglichkeit, die gesamte Anfrage zu speichern (einschließlich vielleicht der POST-Daten, falls erforderlich)?

Hier ist die Zusammenfassung Controller:

abstract class AbstractAuthActionController extends AbstractActionController { 

    public function onDispatch(MvcEvent $e) { 
     $serviceManager = $e->getApplication()->getServiceManager(); 
     $auth = $serviceManager->get ('LdapAuth\Client\Ldap'); 
      if (! $auth->hasIdentity()) { 
       $uri = $e->getRequest()->getRequestUri(); 
       $callBackFunction = $this->getLdap()->getCallBackFunction(); // = new SessionData(); 
       $callBackFunction::setOriginalUri($uri); // function to store temporarly the uri 
       return $this->redirect()->toRoute ('ldap-login-route'); 
     } else { 
      return parent::onDispatch ($e); 
     } 
    } 
} 

Antwort

0
  1. Viele Menschen tun das, weil sie möchte pflegen Authentifizierung vor dem Controller dispatch Fall zu überprüfen. Die Authentifizierung kann sehr viel früher im Prozess überprüft werden, zum Beispiel unter route Event oder zumindest bevor der Controller instanziiert wurde (Dispatch mit höherer Priorität als Controller).

    Falls der Benutzer nicht authentifiziert ist, dass Sie mit einem 401 (unberechtigten) reagieren wollen oder 403 (verboten) oder eine 302 (bewegte vorübergehend) Reaktion so früh wie möglich (etwas mehr Hintergrund auf diesem Statuscode here on Wiki lesen) zu verhindern der gesamte Overhead, der nur Ihren Server (unnötig) belegt und somit Ihre Anwendung verlangsamt und die nicht authentifizierte Antwort verzögert.

    module.php ist NICHT der beste Ort, alles authentication zugehörigen Code hinzuzufügen.Besser wäre es, einen Authentifizierungs-Listener zu erstellen (und einen Authentifizierungs-Service in den Listener zu injizieren) und nur den Listener in Ihrem module.php zu verbinden.

  2. Lesen Sie den Unterschied zwischen Redirect und Forward here in this answer. Wenn Sie den Client, der nicht korrekt authenticated in einer Antwort mit einem 302 Statuscode umleiten möchten, müssen Sie eine Weiterleitungsantwort senden, die diesen Statuscode enthält. Ich sehe auch, dass Leute in solchen Fällen weiterleiten, aber meiner Meinung nach ist das nicht korrekt, weil der Client nicht über irgendeine Weiterleitung informiert wird. Sie könnten auch Authentifizierungsmodule wie ZfcUser überprüfen, um zu sehen, wie sie damit umgehen.

  3. Sie müssen diese URL nicht auf dem Server speichern. Sie können die URL, zu der Sie wechseln möchten, nach dem Anmelden (der ursprünglichen URL) in der Weiterleitungsantwort senden. Zum Beispiel leiten Sie von einer Anfrage an login.php bei profile.php gezielt, dann Umleitungs-URL könnte wie folgt aussehen:

    http://www.example.com/login.php?redirect=profile.php

    können Sie jetzt die Umleitung in den Login-Prozess/Regler so eingestellt, dass nach einem erfolgreichen Login Sie Senden Sie den Client an profile.php zurück.