laravel11+sanctum权限认证死循环

运行环境

laravel版本:11.12.0
sanctum版本:4.0.2

报错定位

修改config/auth.phpguard.web.driversanctum就会报错

相关代码

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()
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

我上周测试发现,使用 Sanctum 的 API Token 方式时,不需要任何配置,不用修改 config/auth.php 配置。

比如我加了 WechatUser 模型,也不用加一个新的 guard。Sanctum 会自动检测 Authorization 然后把 auth()->user() 设置为 WeChatUser,不用管 guard。

6个月前 评论
91it (楼主) 6个月前
91it (楼主) 6个月前
xuchunyang (作者) 6个月前
讨论数量: 10
Mutoulee

你的这个'provider' => 'api', 是啥?贴出来看看 。

6个月前 评论
91it (楼主) 6个月前
Mutoulee (作者) 6个月前
91it (楼主) 6个月前

我上周测试发现,使用 Sanctum 的 API Token 方式时,不需要任何配置,不用修改 config/auth.php 配置。

比如我加了 WechatUser 模型,也不用加一个新的 guard。Sanctum 会自动检测 Authorization 然后把 auth()->user() 设置为 WeChatUser,不用管 guard。

6个月前 评论
91it (楼主) 6个月前
91it (楼主) 6个月前
xuchunyang (作者) 6个月前

file

你的应该是在这里死循环了 因为sanctum可以前置支持其他方式认证 然后你那个里面的guard又有sanctum认证方式 然后又会走到这里来 所以就死循环了 如果你只想使用sanctum认证 你可以把config/sanctum.php 的guard设置为空数组就可以了

6个月前 评论
91it (楼主) 6个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!