2016-09-22 67 views
1

我們有會話守衛,這就夠了。Laravel 5.2:在同一路線上的會話和令牌守衛

現在我們需要通過令牌(在頭文件或GET參數中)和通過會話在相同的路線上添加授權。

通過令牌授權必須是無狀態的。

UPD: 首先,我們考慮創建複製路線。 一個會話和一個令牌

// api token auth 
// url: /api/test 
Route::group(['middleware' => ['web', 'auth:api'], 'prefix' => 'api', 'as' => 'api.'], function() { 
    Route::resource('test', 'TestController'); 
    // 50+ routes 
}); 

// session auth 
// url: /test 
Route::group(['middleware' => ['web', 'auth']], function() { 
    Route::resource('test', 'TestController'); 
    // 50+ routes 
}); 

,但它不是我們所希望的,因爲URL是不同的。

也許有人知道如何解決這個問題?

回答

5

創建新的中間件AuthenticateWithToken:

class AuthenticateWithToken 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @param string|null $guard 
    * 
    * @return mixed 
    */ 
    public function handle($request, Closure $next, $guard = null) 
    { 
     if (($user = Auth::guard('api')->user())) { 
      Auth::setUser($user); 
     } 

     return $next($request); 
    } 
} 

聲明它在HTTP/Kernel.php:

/** 
* The application's route middleware. 
* 
* These middleware may be assigned to groups or used individually. 
* 
* @var array 
*/ 
protected $routeMiddleware = [ 
    // ... 
    'auth.api' => \App\Http\Middleware\AuthenticateWithToken::class, 
    // ... 
]; 

和默認前加入在routes.php文件 '權威性' 中間件:

Route::group(['middleware' => ['web', 'auth.api', 'auth']], function() { 
    Route::resource('test', 'TestController'); 
    // 50+ routes 
}); 
+0

你讓我的一天,謝謝! –

+0

任何想法如何做同樣的事情,但使用護照,而不是令牌警衛? – Mike

+0

沒有任何其他人只需使用'auth.api'中間件 – Mike