【发布时间】:2021-01-05 19:47:50
【问题描述】:
我正在尝试使用多个警卫来制作 Laravel - 取决于身份验证类型。
当我通过 API 进行身份验证时,我想使用 jwt 守卫。当我通过网络进行身份验证时,我想使用sessionguard。
我的config\auth.php 看起来像这样:
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'jwt',
'provider' => 'users',
//'hash' => false,
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
]
我的routes/web.php 看起来像这样:
Route::get('/', 'HomeController@index')->name('home');
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
我的routes/api.php 看起来像这样:
Route::post('login', 'AuthController@login');
Route::get('logout', 'AuthController@logout');
Route::post('refresh', 'AuthController@refresh');
Route::get('me', 'AuthController@me');
我得到的是 API 身份验证工作正常,而网络却不行。我已经调试过了,它似乎总是在检查jwt 守卫。
有人可以帮我吗,如果可能的话,我如何将警卫设置在路线上或Auth::routes() 电话上?
【问题讨论】:
-
在处理来自“网络”路由的任何操作时,您必须指定要使用的警卫……或者您必须使用
web参数应用auth中间件,@ 987654335@ 以便它将默认设置为web用于受该中间件保护的路由......大多数用于身份验证的控制器都在其构造函数中定义了中间件 -
@lagbox 你能帮我看看你会怎么做吗?你认为我在
Route::group(['middleware' => ['auth:web']], function () {中包含routes/web.php代码吗? -
否,因为所有内容都不需要进行身份验证,并且这些控制器在其构造函数中定义了它们的中间件......您将默认保护保留为
web并修改您的内容可能会更容易需要“api”端 -
@lagbox 这是我的第一个想法,我尝试过这样,但后来我很难使用 API 进行身份验证,因为它总是需要令牌(即使在登录 url 上)
-
因为
auth中间件仅适用于需要经过身份验证的用户的路由;登录路由必须允许未经身份验证的用户访问它,否则他们无法进行身份验证
标签: laravel jwt laravel-jwt