我在Laravel和基本身份验证中实施了护照身份验证。我有UserController,里面有构造函数methode:
public function __construct()
{
$this->middleware('auth.basic.once')->except(['index', 'show']);
$this->middleware('auth:api')->except(['index', 'show']);
}
OnceBasic中间件:
public function handle($request, Closure $next)
{
if(Auth::guard('api')->check())
return $next($request);
else
return Auth::onceBasic() ?: $next($request);
}
在OnceBasic中间件中,我能够检查用户是否使用auth:api
进行了身份验证,然后阻止了身份验证尝试使用onceBasic
,因此在使用访问令牌时它可以正常工作。但是,当尝试使用oneBasic(电子邮件,密码)进行身份验证时,它会失败,因为auth:api
也尝试进行身份验证,并且也会失败(试图在默认redirectTo()
中调用\App\Http\Middleware\Authenticate.php
方法)
我的问题是有一种方法可以同时使用这两种中间件,从而仅成功地对其中一种进行身份验证并阻止其他中间件工作?
我对两个后卫使用同一控制器的方法要求将两组单独的路由指向控制器。我在此answer to a similar question中提供了一个示例,这里再次是示例代码:
<?php
Route::middleware(['auth:admin_api'])->group(function () {
Route::prefix('admin')->group(function () {
Route::name('api.admin.')->group(function () {
////////////////////////////////////////////////////////////
/// PLACE ADMIN API ROUTES HERE ////////////////////////////
////////////////////////////////////////////////////////////
Route::apiResource('test','App\Http\Controllers\API\MyController');
////////////////////////////////////////////////////////////
});
});
});
Route::middleware(['auth:api'])->group(function () {
Route::name('api.')->group(function () {
////////////////////////////////////////////////////////////
/// PLACE PUBLIC API ROUTES HERE ///////////////////////////
////////////////////////////////////////////////////////////
Route::apiResource('test', 'App\Http\Controllers\API\MyController');
////////////////////////////////////////////////////////////
});
});
因此,当管理员用户进入admin / test时,它将使用admin身份验证保护,而普通用户进入/ test时,它将使用标准身份验证保护。这两个都使用相同的控制器。
然后,我为我的应用创建了基本控制器。这是我确定使用guard来访问构造函数中的路由的方式:
<?php
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;
class BaseController extends Controller
{
protected $user;
protected $isAdmin = false;
public function __construct()
{
if(Auth::guard('admin_api')->check()) {
$this->user = Auth::guard('admin_api')->user();
$this->isAdmin = true;
} elseif(Auth::guard('api')->check()) {
$this->user = Auth::guard('api')->user();
$this->isAdmin = false;
} else {
return response()->json([
'message' => 'Not Authorized',
], 401);
}
}