Laravel 在身份验证异常时自动重定向
Posted
技术标签:
【中文标题】Laravel 在身份验证异常时自动重定向【英文标题】:Laravel automaticly redirect on authentication exception 【发布时间】:2018-05-09 09:14:12 【问题描述】:我正在使用 laravel 5.5 并试图保护 api 路由。我将“auth”中间件分配给此路由,但是当我测试它时,我得到一个 InvalidArgumentException aka 'Route [login] is not defined'。我没有以任何方式引用这条路线,laravel 自动尝试重定向到这条路线。我在文件 'laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php' 中找到了以下代码行:
/*
* Convert an authentication exception into a response.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Auth\AuthenticationException $exception
* @return \Illuminate\Http\Response
*/
protected function unauthenticated($request, AuthenticationException $exception)
return $request->expectsJson()
? response()->json(['message' => $exception->getMessage()], 401)
: redirect()->guest(route('login'));
所以我想知道,在每条路线上全局捕获此异常的最佳方法是什么?
【问题讨论】:
【参考方案1】:据我了解,这是因为您在路由中添加了 auth
中间件。因此,每当在没有身份验证的情况下访问路由时,路由都会重定向到默认登录页面name login route
。
您可以使用以下代码将unauthenticated
方法添加到您的app/Exceptions/Handler.php
。因此,如果请求在API
中或期待JSON
响应,它将给出带有JSON 响应的401
状态代码。如果使用 web 路由访问该路由,它将被重定向到默认页面。在下面的示例中,我将其重定向到登录页面。
注意:这个方法存在于 app/Exceptions/Handler.php
直到 laravel 5.4。
protected function unauthenticated($request, AuthenticationException $exception)
if ($request->expectsJson())
return response()->json(['error' => 'Unauthenticated.'], 401);
return redirect()->guest(('login'));
别忘了导入use Illuminate\Auth\AuthenticationException;
编辑:错误Route [login] is not defined
的解释。这是因为 laravel 试图重定向到 named route
。如果您使用laravel auth scaffolding
,则此命名路由可用。如果是手动创建函数,即使路由login
存在,也应该命名为login
。欲了解更多信息,请参阅https://laravel.com/docs/5.5/routing#named-routes
【讨论】:
以上是关于Laravel 在身份验证异常时自动重定向的主要内容,如果未能解决你的问题,请参考以下文章
使用身份验证护照系统覆盖 laravel 中 apis url 的身份验证重定向
Laravel - 具有多重身份验证的未经身份验证的重定向问题