2016-04-13 6 views
5

Ich habe eine Middleware, die einen JWT Benutzer mit tymon/jwt-auth Paket authentifiziert:Run Middleware vor Controller-Konstruktor auf Laravel 5.1?

public function handle($request, \Closure $next) 
{ 
    if (! $token = $this->auth->setRequest($request)->getToken()) { 
     return $this->respond('tymon.jwt.absent', 'token_not_provided', 400); 
    } 

    try { 
     $user = $this->auth->authenticate($token); 
    } catch (TokenExpiredException $e) { 
     return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]); 
    } catch (JWTException $e) { 
     return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]); 
    } 

    if (! $user) { 
     return $this->respond('tymon.jwt.user_not_found', 'user_not_found', 404); 
    } 

    $this->events->fire('tymon.jwt.valid', $user); 

    return $next($request); 
} 

Dann habe ich einen Controller und ich mag den Benutzer von der Middleware an die Steuerung zu übergeben.

Also habe ich auf dem Controller:

public function __construct() 
{ 
    $this->user = \Auth::user(); 
} 

Das Problem ist, dass $this->usernull ist, aber wenn ich dieses von der Steuerung auf ein Verfahren zu tun, es ist nicht null.

So:

public function __construct() 
{ 
    $this->user = \Auth::user(); 
} 

public function index() 
{ 
    var_dump($this->user); // null 
    var_dump(\Auth::user()); // OK, not null 
} 

Also das Problem ist, dass __construct vor der Middleware läuft. Wie kann ich das ändern, oder haben Sie eine andere Lösung?

Update: Ich verwende dingo/api für das Routing, vielleicht ist es ein Fehler auf ihrer Seite?

+0

Sie können das nicht tun. Sie haben darüber nachgedacht, wie Sie diesen Benutzer von der Middleware (nicht vom Controller) übergeben können. – num8er

+0

@ num8er Selbst wenn ich den '$ user' Parameter wie folgt übergebe:' $ request-> attributes-> add (compact ('user')); 'Ich bekomme das selbe Ergebnis auf dem Controller, da der Konstruktor vor dem läuft Middleware. (wahrscheinlich Dingo/api Fehler) – HtmHell

+0

Überprüfen Sie meine Antwort – num8er

Antwort

0

1) Entfernen Sie Ihre Middleware von Ihrem Kernel $middleware Array

2) Setzen Sie Ihre Middleware $routeMiddleware Array mit benutzerdefinierten Namen jwt.auth:

protected $routeMiddleware = [ 
    // ... 
    'jwt.auth' => 'App\Http\Middleware\YourAuthMiddleware' 
]; 

2) Erstellen Base in übergeordnetem Verzeichnis der Nadel Controller, mit Funktion:

public function __construct() { 
    $this->middleware('jwt.auth'); 
} 

3) Erweitern Sie den Nadelcontroller von BaseController

4) Stellen __construct Funktion der Nadel-Controller wie folgt aussehen:

public function __construct() { 
    parent::__construct(); 
    $this->user = \Auth::user(); 
}