首页 > 解决方案 > Laravel Nova 自定义工具 - 如果未通过身份验证,则重定向到登录页面

问题描述

问题

在创建了几个 Laravel Nova 工具后,我发现即使用户在不同的选项卡中注销,也可以导航到自定义工具。

即使未经身份验证,Laravel Nova 工具仍然可以访问。

解释

Laravel Nova 文档中,声明 Laravel Nova 开箱即用的授权中间件负责对您的工具路由组中指定的路由进行身份验证。这似乎有效;当我在另一个选项卡中注销并尝试导航到我的自定义工具时,它确实显示了视图,但它没有加载我尝试进行的任何 HTTP (Axios) 调用。它返回以下消息:

{message: "Unauthenticated."}

这是有道理的,因为 Authorization 中间件返回 a aborts the request with 403 status code。Laravel Nova 使用AuthenticationException文件来处理这个问题:

/**
 * Render the exception.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function render($request)
{
    if ($request->expectsJson()) {
        return response()->json(['message' => $this->getMessage()], 401);
    } elseif ($request->is('nova-api/*') || $request->is('nova-vendor/*')) {
        return redirect()->to($this->location());
    }

    return redirect()->guest($this->location());
}

nova-api/*对路由或路由进行的任何调用都会nova-vendor/*被捕获并重定向到登录页面。因此,在未经身份验证的情况下尝试访问“常规”Laravel Nova 资源会导致被重定向到 Laravel Nova 的登录页面。

不幸的是,显示工具本身视图的路由是在一个单独的tool.js文件中完成的,其中路由直接绑定到组件,如下所示:

Nova.booting((Vue, router, store) => {
  router.addRoutes([
    {
      name: 'mailable-previewer',
      path: '/mailable-previewer',
      component: require('./components/Tool'),
    },
  ])
})

我试过的

我尝试覆盖异常消息以返回重定向,但不幸的是,这不起作用,视图仍然可见,并且 Laravel Nova 登录页面仅在网络选项卡的响应中可见,因为它不会重定向用户直接地。

Tool.vue我发现的一种解决方法是在自定义文件中执行 axios 调用,其中401 status code应该重新加载页面(从而再次激活 Laravel Nova 的授权中间件,将用户重定向到登录页面)。

我想达到什么

在加载自定义工具组件之前,找到一种将未经身份验证的用户重定向到 Laravel Nova 登录页面的方法。这是否可能使用:

  1. tool.js使用某种中间件扩展文件以在用户未经身份验证时以某种方式阻止导航到选项卡?

非常感谢任何正确答案的方向!

标签: laravelauthenticationlaravel-novalaravel-middleware

解决方案


推荐阅读