2016-07-27 129 views
0

我正在使用laravel 5.2Laravel獲得Auth變量 - api令牌和基於會話的身份驗證

最近,我已更新Auth模塊,以便基於session的基於web的認證和基於api_token的基於外部API調用的認證。

現在,我在使用Auth::id()Auth::user()時發現錯誤,其中我使用了基於api_token的身份驗證。所以我不得不使用Auth::guard('api')->id()Auth::guard('api')->user()方法。

現在,我的問題是,是否有任何常見的方法,我可以用於這兩個無論基於api_token基於身份驗證或session基於?那麼auth()->user()auth()->id()

如果我使用任何方法進行身份驗證,該怎麼辦?例如,methodA()用於基於api_token的身份驗證以及基於session的基於身份驗證,如果我需要使用Auth變量,如何處理該情況?

回答

1

我認爲處理常規請求(通過基於會話的認證)的控制器應該與api控制器(基於令牌的認證)分開。因此,每個控制器都會對功能的一部分負責。另外,api控制器中的更改不會在會話控制器中產生副作用。因此,您可以在每個控制器中明確指定auth guard。 Laravel需要明確指定警戒,否則將使用默認警衛。沒有辦法讓人聰明地猜測自己使用什麼警衛。當然,你可以做這樣的事情:

public function action(Request $request) 
{ 
    $guard = $request->has('api_token') ? 'api' : 'session'; 
    $authUser = Auth::guard($guard)->user(); 

    //your code next 
} 

如果你將使用單獨的控制器,你可以將常用的功能概括到父抽象控制器。請注意,在下面的示例中,ChildControllers僅通過名稱空間不同。 父級:

<?php 

namespace App\Http\Controllers\Api 

use App\Http\Controllers\Controller; 

abstract class ParentController extends Controller 
{ 
    public function action(Request $request) 
    { 
     $authUser = Auth::guard($this->guard)->user(); 

     //your code... 
    } 
} 

API控制器:

<?php 

namespace App\Http\Controllers\Session 

use App\Http\Controllers\ParentController 

class ChildController extends ParentController 
{ 
    protected $guard = 'session'; 

    //your code... 
} 

會話控制器:

<?php 

namespace App\Http\Controllers\Api 

use App\Http\Controllers\ParentController 

class ChildController extends ParentController 
{ 
    protected $guard = 'api'; 

    //your code... 
} 
相關問題