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 5 中进行身份验证后重定向

使用身份验证护照系统覆盖 laravel 中 apis url 的身份验证重定向

Laravel - 具有多重身份验证的未经身份验证的重定向问题

Laravel - 用户未通过身份验证时如何重定向到所需页面

Laravel 5.5 - 升级身份验证后没有正确重定向

Laravel Fortify 自定义身份验证重定向