Laravel Breeze 身份验证中间件在未经身份验证时不会重定向



我正在使用Laravel 9,扩展Laravel Breeze进行身份验证。 我有受身份验证中间件 (AppHttpMiddlewareAuthenticate.php) 保护的路由,其中我指定redirectTo()应该返回route('auth.login')。 这一直很好,直到几天前突然全部停止了!大约在同一时间,我引入了Laravel Sanctum用于API身份验证。

如果未登录,并且您尝试访问受保护的路由,则会弹出以下 500 错误:

尝试在vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:191 处读取布尔值上的属性"标头">

我尝试调试它,发现问题出在 Laravel 主Authenticate.php类的unauthenticated()方法中。重定向未正确发生。当我在应用程序的Authenticate.php中扩展此类时,我意识到以下内容有效,并且出现 404 错误:

protected function unauthenticated($request, array $guards)
{
abort(404);
}

但是,如果我执行以下操作,我将返回到上述链接中详述的原始错误:

protected function unauthenticated($request, array $guards)
{
return redirect(route('auth.login'));
}

我无法解释为什么会这样。如果我回显重定向,它也有点工作,但这是一个黑客。

有人,请帮忙解释一下发生了什么。

经过更多调试,我发现问题确实出在Authenticate中间件上,特别是在unauthenticated()方法中。 这会抛出AuthenticationException而又被我添加的自定义处理程序劫持,该处理程序是我引入的 Laravel sanctum 的一部分,但忘记了用于 API 身份验证。

此处理程序的目的是在 API 请求未通过身份验证时覆盖默认的 Laravel 错误消息。

在那里,我检查请求是否针对/api路由,然后返回自定义错误消息。但是,如果不是,我会true返回.这是罪魁祸首。

$this->renderable(function (AuthenticationException $e, $request) {
if ($request->is('api/*')) {
return response()->json(['error' => 'Not authorised.'], 401);
}
return true; //Bad
});

正确的方法(当我希望Laravel处理任何其他请求时)是简单地不返回任何内容。 文档说:

如果提供给可渲染方法的闭包没有返回值,则将使用 Laravel 的默认异常渲染

最新更新