2016-04-13 18 views
5

Tôi có một middleware rằng xác thực người dùng JWT sử dụng tymon/jwt-auth gói:Chạy phần mềm trung gian trước khi xây dựng bộ điều khiển trên 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); 
} 

Sau đó, tôi có một bộ điều khiển và tôi muốn vượt qua người sử dụng từ các trung gian để điều khiển.

Vì vậy, tôi đã làm trên bộ điều khiển:

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

Vấn đề là $this->usernull, nhưng khi tôi làm điều này trên một phương pháp điều khiển, nó không phải là null.

Vì vậy:

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

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

Vì vậy, vấn đề là __construct đang chạy trước khi middleware. Làm thế nào tôi có thể thay đổi điều đó, hoặc bạn có một giải pháp khác?

Cập nhật: Tôi đang sử dụng dingo/api để định tuyến, có thể đó là lỗi về phía họ?

+0

Bạn không thể làm điều đó. Bạn có suy nghĩ về cách chuyển người dùng đó từ phần mềm trung gian (không phải từ bộ điều khiển). – num8er

+0

@ num8er Ngay cả khi tôi chuyển tham số '$ user' như thế:' $ request-> attributes-> add (compact ('user')); 'Tôi nhận được kết quả tương tự trên controller, bởi vì constructor chạy trước middleware. (có thể là lỗi dingo/api) – HtmHell

+0

kiểm tra câu trả lời của tôi – num8er

Trả lời

0

1) Di middleware của bạn từ $middleware mảng của kernel của bạn

2) Đặt middleware của bạn để $routeMiddleware mảng với tên tùy chỉnh jwt.auth:

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

2) Tạo BaseController trong thư mục cha của bộ điều khiển kim, với chức năng:

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

3) Mở rộng bộ điều khiển kim từ BaseController

4) Hãy __construct chức năng của bộ điều khiển kim trông như thế này:

public function __construct() { 
    parent::__construct(); 
    $this->user = \Auth::user(); 
} 
Các vấn đề liên quan