Laravel 7 UI-会话保护驱动程序-Spatie权限包



简而言之:会话保护驱动程序拒绝了我的登录尝试。

在创建Laravel UI之前,我已经为我的前端创建了一个身份验证系统,使用JWT作为api保护驱动程序。

我安装了Laravel UI,以便使用Spatie Permission Package,该软件包也已安装并生成了一些额外的表。

安装Laravel UI后,我成功注册了一个新用户,但没有重定向到主屏幕。我试图以新用户的身份登录,但得到的回复是我的凭据无法识别。然后,我尝试通过前端注册使用之前在users表中创建的用户登录。。。

虽然这次没有出现错误,但它仍然没有重定向我。然后我尝试与新创建的用户一起登录前端应用程序,并成功了。此时我认为令牌存在冲突。

我在RegisterController.php中查看了以下内容:

protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}

我的前端JWT身份验证系统也使用User.php,所以我看了一眼,发现密码被加密了两次。首先使用Hash::,然后使用bcrypt。因此,我删除了哈希加密。

我注册成功,但再次没有重定向到主页。我试图再次登录,但再次无法登录,但这次我没有收到错误消息!注册用户现在的行为方式与通过前端应用程序注册的用户相同。

我一行接一行地查看了代码,花了几个小时注销了值等,可以看到所有的东西都被接受了,我被重定向到主页,但HomeController.php随后通过auth-guard传递了我的凭据,然后被拒绝,然后将我重定向回登录!!

我访问home的唯一方法是将HomeController.php中的中间件从"auth"更改为"guest":

public function __construct()
{
$this->middleware('guest'); // changed from 'auth'
}

在Spatie文档中,它说明了以下内容:

如果你的应用程序只使用一个防护程序,但不是web(Laravel的默认设置,在auth-config文件中显示"first"(,那么在config/auth.php中更改列出的防护程序的顺序,将你的主防护程序列为默认防护程序和已定义防护程序列表中的第一个。当你编辑该文件时,最好也删除你不使用的任何防护措施。

因此,我在config/auth.php中切换了防护程序,因此api是第一个,但没有效果。

'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
'web' => [
'driver' => 'session',
'provider' => 'users',
],
],

前端使用api保护,后端使用web,但它们都使用相同的app/User。我想这一定是问题的原因,但我是拉拉维尔的新手,经过几个小时的阅读和测试,我仍然在挣扎。它想让我错过什么!?密码现在被接受,所以不能是那样的。。

如有任何帮助,我们将不胜感激。非常感谢。

问题出现在config/auth的顶部,我错过了:

'defaults' => [
'guard' =>'api',
'passwords' => 'users',
],

这并不是说我被web会话驱动程序拒绝了,而是在上面的默认部分中,web防护程序被api防护程序覆盖了。

我必须在路由中指定我想要的中间件,以避免默认的:

Route::get('/home', [
'middleware' => 'auth:web', 'uses' => 'HomeController@index'])->name('home');

编辑:由于auth:web只由几个控制器使用,因此更好的解决方案是将config/auth中的默认保护更改为web,然后与使用api保护的其他控制器一起执行Route::group

Route::group([
'middleware' => 'api'
], function () {
Route::post('login', 'AuthController@login');
Route::post('register', 'AuthController@register');
Route::post('logout', 'AuthController@logout');
Route::post('refresh', 'AuthController@refresh'); 
});

最新更新