Authentifizierung im Slim: ist eine Kombination aus middleware, singleton-und hook-Ansatz smart?
Ich geschrieben habe meine eigene Authentifizierung-controller für die Authentifizierung der Benutzer in meine Schlanke Anwendung. Obwohl es funktioniert, ich bin nicht sicher, ob dies ist die Art, wie Schlank arbeiten soll.
Mein controller Authentifizierung $auth
hat Methoden wie $auth->login($user, $password)
und $auth->logout()
ändern, dass der Status der Sitzung und Methoden, die den status zu berichten, wie $auth->userIsLoggedIn()
. Auch in Anbetracht einer Anfrage, kann es bestimmen, wenn ein Benutzer hat Zugriff auf die gewünschte route.
Derzeit bin ich mit einer einzigen Instanz von $auth
in meinem Slim-Anwendung in zwei verschiedenen Arten: als ein singleton registriert $app->auth
und als route middleware, die für alle Routen. Also, die Schlanke Applikation ist bootstrapped wie diese:
//Create singleton instance of MyAuthWrapper
$app->auth = new MyAuthenticationWrapper( array() );
//Attach the same instance as middleware to all routes
$app->add( $app->auth );
Ich bin mit dem singleton-Instanz aus, die in meinen Routen, Z. B. in der login-route:
$app->post( '/login', function() use ($app)
{
//...
$user = $app->auth->authenticate( $app->request()->post('username'), $app->request()->post('password') );
//...
}
Und ich bin mit dem middleware-version, in der alle Routen durch das anbringen einer Methode, um die slim.before.dispatch
Haken, der überprüft, ob der Benutzer authentifiziert ist und leitet auf die login-Seite anders. Um dies zu tun, die Authentifizierung wrapper erweitert \Slim\Middleware und setzt damit den call
- Methode, wie folgt aus (vereinfacht):
class MyAuthenticationWrapper extends \Slim\Middleware
{
//... Implementation of methods such as authenticate(), isLoggedIn(), logout(), etc.
public function call()
{
$app = $this->app;
$isAuthorized = function () use ($app) {
$hasIdentity = $this->userIsLoggedIn(); //Assume this to work
$isAllowed = $this->userHasAccessToRequestedRoute(); //Assume this to work
if ($hasIdentity && !$isAllowed)
{
throw new Exception("You have no access to this route");
}
if (!$hasIdentity && !$isAllowed)
{
return $app->redirect( $loginPath );
}
};
$app->hook('slim.before.dispatch', $isAuthorized);
$this->next->call();
}
}
Verwendung eines singleton ist eine leichte code smell zu mir, aber dann hinzufügen die singleton-Instanz als middleware mit $app->add( $app->auth )
fühlt sich schlicht schmutzig. Und schließlich mithilfe der middleware registrieren Sie einen Verschluss, um die dispatch-hook macht mich Frage mich, ob diese ganze Strategie ist nicht zu verworren für ein framework namens Slim. Aber ich kann nicht herausfinden, ob es einen einfacheren oder eleganteren Weg das zu erreichen, was ich will.
Die Frage: Bin ich auf dem richtigen Weg, oder bin ich etwas fehlt, wie etwa Dünne arbeiten, die mir erlauben würde, dies zu erreichen in einer weniger komplexen Weise?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist absolut auf dem richtigen Weg mit der Middleware registrieren Sie einen Haken für die Authentifizierung. Das ist der Ansatz, den ich nehmen, und der Ansatz, den ich umgesetzt habe, in meiner eigenen Bibliothek, Slim Auth.
Mit einem Singleton kann definitiv ein code smell, aber nicht immer. Wenn Sie denken, Sie brauchen zu überarbeiten MyAuthenticationWrapper, das ist völlig bis zu Ihnen. Die Weise, die Sie mit Middleware und Haken, mit Ihrer benutzerdefinierten Klasse ist, IMHO, zu 100% auf das Ziel.
Anmerkung: Eines meiner mottos ist "Make it work, und dann umzugestalten." Es sieht aus wie Sie auf dem richtigen Weg bist es auch, also Hut ab.
Schließlich, Authentifizierung und Autorisierung sind komplexe Themen erfordern komplexe Lösungen. Komplex bedeutet nicht bedeuten, verworren, schwer zu pflegen spaghetti, aber es kann dazu führen, dass mehr code, als ich es mir erhofft hatte zu schreiben (oder mehr Abhängigkeiten, als ich gehofft hatte ziehen in der via Composer).
UPDATE
Wenn
$app->auth
Middleware ist, dann ja, du bist abseits der Strecke ein bisschen. Ihr Instinkt zu erstellen Middleware registrieren Sie einen Haken tot ist, sondern Middleware Middleware und sollte nicht verwendet werden, außerhalb dieses Kontexts. Im Idealfall würden Sie anlegen (oder noch besser finden Sie ein package auf Packagist) ein auth-Klasse, die Sie verwenden können, sowohl in den Routen und in der Middleware. Pseudo-code würde ungefähr so Aussehen:Hier ist ein Beispiel Middleware von Slim-Auth. Ich habe zusammen eine Beispiel für die Implementierung können Sie schauen, um zu sehen, wie ich es alle zusammen.
$app->auth
eine middleware? Oder ist es ein auth-Objekt, das Sie einer Injektion in Ihre Routen und in der Middleware? Die Art und Weise, die Sie geschrieben haben, deine Frage sieht aus wie du bist Injektion Middleware in Ihre Routen.