我正在使用laravel 5.2
。
最近,我已更新Auth
模块,以便基于session
进行基于身份验证和基于api_token
的外部API调用身份验证。
现在,我发现在使用基于Auth::id()
身份验证的Auth::user()
和api_token
时出错。因此我不得不使用Auth::guard('api')->id()
和Auth::guard('api')->user()
方法。
现在,我的问题是,无论基于api_token
的身份验证还是基于session
,我都可以使用任何常用方法吗?那么auth()->user()
和auth()->id()
怎么样?
如果我使用any方法进行两种身份验证怎么办?例如,methodA()
在基于api_token
的身份验证以及基于session
的身份验证中使用,如果我需要使用Auth
变量,我该如何处理?
答案 0 :(得分: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\Api
use App\Http\Controllers\ParentController
class ChildController extends ParentController
{
protected $guard = 'api';
//your code...
}
会话控制器:
<?php
namespace App\Http\Controllers\Session
use App\Http\Controllers\ParentController
class ChildController extends ParentController
{
protected $guard = 'session';
//your code...
}