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?

Schreibe einen Kommentar