2016-04-13 30 views
5

Ho un middleware che autentica un utente JWT utilizzando tymon/jwt-auth pacchetto:Esegui il middleware prima del costruttore del controller su 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); 
} 

poi ho un controller e voglio passare l'utente dal middleware al controller.

Così ho fatto sul controller:

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

Il problema è che è $this->usernull, ma quando faccio questo su un metodo del controller, non è nulla.

Quindi:

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

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

Quindi il problema è che __construct è in esecuzione prima del middleware. Come posso cambiarlo o hai un'altra soluzione?

Aggiornamento: sto usando dingo/api per il routing, forse è un errore dalla loro parte?

+0

Non puoi farlo. Hai pensato a come passare quell'utente dal middleware (non dal controller). – num8er

+0

@ num8er Anche quando passo il parametro '$ user' in questo modo:' $ request-> attributes-> add (compatto ('user')); 'Ho lo stesso risultato sul controller, perché il costruttore viene eseguito prima del middleware. (probabilmente errore dingo/api) – HtmHell

+0

verifica la mia risposta – num8er

risposta

0

1) Rimuovere middleware da $middleware gamma del vostro kernel

2) Metti il ​​tuo middleware per $routeMiddleware array con nome personalizzato jwt.auth:

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

2) Creare BaseController nella directory principale del regolatore ago, con funzione:

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

3) Estendere il controller dell'ago da BaseController

4) Fai __construct funzione del regolatore dell'ago a guardare in questo modo:

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