我在我的 laravel 项目中使用了多个身份验证,它工作正常:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
'admins' =>[
'driver' => 'session',
'provider' => 'admins',
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => AppUser::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => AppAdmin::class,
],
],
但是我在保护我的一些路线方面遇到了问题。我希望这些路由由两种类型的身份验证保护访问。如果"管理员"防护用户已登录,或者"用户"防护用户已登录,我希望能够访问路由。现在我的路线是这样的:
Route::group(['middleware' =>'auth'], function () {
Route::get('/add/tutorial',[
'uses'=>'AddTutorialController@getAddTutorialIndex',
'as'=>'frontend.add.tutorial'
]);
});
有了这个,只有我的"用户"保护中的用户可以访问此路由。
我想访问类似这样的东西:
Route::group(['middleware' =>['auth' OR 'auth:admins']],...
有没有办法让两个身份验证守卫访问路由?? 我应该使用哪种中间件组?
如果可以向 \app\Http\Middleware\Authenticate 添加一个附加参数.php例如:
public function handle($request, Closure $next, $guard = null, $default = false)
{
if($guard && $default) {
// check for specified $guard OR default guard
$authorized = Auth::guard($guard)->guest() || Auth::guard(null)->guest();
} else {
// use specified guard ( or null if non given )
$authorized = Auth::guard($guard)->guest();
}
if ($authorized) {
if ($request->ajax() || $request->wantsJson()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('login');
}
}
return $next($request);
}
有了它,您可以在路由组中指定一个附加参数:
Route::group(['middleware' => 'auth:admins,true'], function() {
Route::get('/', function () {
dd('inside');
});
});
如果使用 auth:admins,true,则默认防护和指定的防护(管理员)将使用 OR 进行检查。
如果仅使用身份验证,则将使用默认保护。如果您使用身份验证:管理员管理员防护将仅使用。
这只是一个简单的例子。您可以根据需要对其进行调整,甚至可以编写自己的中间件。
我找到了 3 种方法,如果你能找到有用的:-
第一种方式:-
routes.php
Route::group(['middleware' =>['auth', 'auth:admins']], function () {
Route::get('/add/tutorial',[
'uses'=>'AddTutorialController@getAddTutorialIndex',
'as'=>'frontend.add.tutorial'
]);
});
第二种方式:-
routes.php
Route::get('/add/tutorial',[
'uses'=>'AddTutorialController@getAddTutorialIndex',
'as'=>'frontend.add.tutorial'
])->middleware(['auth', 'auth:admins']);
第三种方式:-
routes.php
Route::get('/add/tutorial',[
'uses'=>'AddTutorialController@getAddTutorialIndex',
'as'=>'frontend.add.tutorial'
])
yourcontroller.php
class YourController extends Controller{
public function __construct(){
$this->middleware(['auth', 'auth:admins']);
}
}