laravel11+sanctum权限认证死循环
运行环境
laravel版本:11.12.0
sanctum版本:4.0.2
报错定位
修改config/auth.php
中guard.web.driver
为sanctum
就会报错
相关代码
config/auth.php
'guards' => [
'web' => [
'driver' => 'session', // 这边driver设置为sanctum 会报错
'provider' => 'users',
],
'api' => [
'driver' => 'sanctum',
'provider' => 'api',
]
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => env('AUTH_MODEL', App\Models\User::class),
],
'api' => [
'driver' => 'eloquent',
'model' => App\Models\Organization::class,
]
]
登录代码
public function login(AuthRequest $request): JsonResponse
{
$user = User::query()->where('email', $request->input('email'))->first();
if (!$user) {
return response_error(msg: '账号或密码错误');
}
if (!password_verify($request->input('password'), $user->password)) {
return response_error(msg: '账号或密码错误');
}
if ($user->disabled) {
return response_error(msg: '账号已被禁用');
}
$user->loginLog()->create(
$request->loginInfo()
);
$user->update([
'last_login_at' => now()
]);
return response_success([
'access_token' => $user->createToken('web')->plainTextToken,
]);
}
报错信息:
local.ERROR: Maximum call stack size of 8339456 bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? {"exception":"[object] (Error(code: 0): Maximum call stack size of 8339456 bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? at /www/wwwroot/xxx/vendor/laravel/sanctum/src/Guard.php:54)
[stacktrace]
#0 [internal function]: Laravel\\Sanctum\\Guard->__invoke()
#1 /www/wwwroot/xxx/vendor/laravel/framework/src/Illuminate/Auth/RequestGuard.php(57): call_user_func()
#2 /www/wwwroot/xxx/vendor/laravel/sanctum/src/Guard.php(57): Illuminate\\Auth\\RequestGuard->user()
#3 [internal function]: Laravel\\Sanctum\\Guard->__invoke()
我上周测试发现,使用 Sanctum 的 API Token 方式时,不需要任何配置,不用修改 config/auth.php 配置。
比如我加了 WechatUser 模型,也不用加一个新的 guard。Sanctum 会自动检测 Authorization 然后把 auth()->user() 设置为 WeChatUser,不用管 guard。