【问题标题】:Redirecting From Middleware In Laravel Is Not Working As Expected从 Laravel 中的中间件重定向未按预期工作
【发布时间】:2020-04-28 19:20:04
【问题描述】:

我正在做一个 react-laravel 项目,我正在尝试使用中间件保护仪表板路由,这是来自中间件的代码

public function handle($request, Closure $next)
{
    $apiToken = $request->bearerToken();
    $isAuthenticated = User::where('api_token', $apiToken)
                            ->where('is_admin', true)
                            ->first();

    if(!$isAuthenticated) {
        return redirect('/');
    }

    return $next($request);
}

现在的问题是,如果用户未通过身份验证,中间件不会重定向到所需的路由,而是将 html 页面作为响应中的文本返回,如下所示。Response in case of of not authenticated user

  <!DOCTYPE html>
  <html lang="en">
    <head>
        <meta charset="utf-8"/>
        <meta name="viewport" content="width=device-width, initial-scale=1"/>
        <meta name="theme-color" content="#000000"/>
        <meta name="description" content="Web site created using create-react-app"/>
        <link rel="stylesheet" href="http://localhost/css/app.css">
        <title>Some Title Here</title>
    </head>
    <body>
        <noscript>You need to enable JavaScript to run this app.</noscript>
        <div id="root"></div>
        <script src="http://localhost/js/app.js"></script>
    </body>
  </html>

我尝试过使用

return redirect()->route('/');

但遗憾的是它也不起作用。

我也尝试使用

抛出 401 异常
abort(401)

并在异常处理程序中捕获它并从那里重定向(就像我对 404 和 500 异常所做的那样,我已成功重定向)但这不起作用,我收到与发送的页面相同的响应消息响应中的文本,所以问题可能是从中间件重定向,有人可以帮我找到问题吗?

【问题讨论】:

    标签: php reactjs laravel redirect middleware


    【解决方案1】:

    所以作为一名前端工程师,我选择了一个快捷的解决方案,并使用 react 和 axios 重定向用户,所以在中间我只是抛出一个状态为 401(未经授权)的 httperror,然后被它捕获axios如下: 我的中间件

        if(!$isAuthenticated) {
          return abort(401);
       }
    

    反应

    const instance = axios.create({
        baseURL: API_PREFIX
    });
    
    instance.interceptors.response.use(
        response => {
            return response;
        },
        function(error) {
            if (error.response.status === 401) {
                window.location.replace("/");
            }
            return Promise.reject(error.response);
        }
    );
    

    对我有帮助的链接:github

    【讨论】:

      【解决方案2】:

      return redirect('/'); 会将用户重定向到项目的公共目录。

      将名称添加到所需的路线,例如:

      Route::get('/route', 'API\Controller@index')->name('route name');
      

      然后你可以重定向到命名路由:

      if(!$isAuthenticated) {
              return route('route name');
          }
      

      【讨论】:

      • 遗憾的是它不起作用,它给了我错误“传递给 Illuminate\Routing\Middleware\ThrottleRequests::addHeaders() 的参数 1 必须是 Symfony\Component\HttpFoundation\Response 的实例,给定的字符串,在第 63 行的 F:\Web\work\monster\vendor\laravel\framework\src\Illuminate\Routing\Middleware\ThrottleRequests.php 中调用“,当我搜索它时,我发现了不相关的答案
      • @WeamAdel 您能否在您的问题中添加您尝试重定向到的路线。并尝试使用 dd();条件中的方法 if(!$isAuthenticated) { dd('test'); } 查看您的代码是否甚至尝试执行条件中的内容。
      • 我尝试了另一种解决方案,它正在发送状态代码并使用 react 重定向。非常感谢您的时间和精力先生:)
      猜你喜欢
      • 1970-01-01
      • 2015-03-15
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多