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

时间:2021-05-05 10:01:28

标签: laravel authentication laravel-nova laravel-middleware

问题

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

Laravel Nova tool still accessible even while unauthenticated.

说明

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

{message: "Unauthenticated."}

这是有道理的,因为授权中间件返回一个带有 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 文件以防止在用户未经身份验证时导航到选项卡?

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

0 个答案:

没有答案