【问题标题】:Laravel Redirect If Authenticated middlewareLaravel 重定向如果经过身份验证的中间件
【发布时间】:2018-02-22 02:48:15
【问题描述】:

我有三种类型的应用程序用户,每一种都有自己的dashboard。我需要检查管理员任何其他用户看不到其他用户仪表板。

有一个中间件RedirectIfAuthenticated

public function handle($request, Closure $next, $guard = null){

    if (Auth::guard($guard)->check() && auth()->user()->type == 'admin'){
        return redirect('/admin');
    }

    if (Auth::guard($guard)->check() && auth()->user()->type == 'author'){
        return redirect('/author');
    }

    if (Auth::guard($guard)->check() && auth()->user()->type == 'client'){
        return redirect('/client');
    }
}

它在guest中间件下。

上面的代码对我来说似乎不错但是当我测试它时,浏览器显示Too many redirects

我做错了什么,最好的处理方法是什么。

【问题讨论】:

  • 没有任何答案有效吗?
  • @BasheerAhmedKharoti 他们都没有工作
  • 能贴一下路线代码吗?
  • @Gammer 你的 . .. 路线代码请!!

标签: php laravel redirect laravel-5 laravel-request


【解决方案1】:

需要稍微修改一下代码

public function handle($request, Closure $next, $guard = null){

        if (Auth::guard($guard)->check() && auth()->user()->type == 'admin'){
            return redirect('/admin');
        }

        if (Auth::guard($guard)->check() && auth()->user()->type == 'author'){
            return redirect('/author');
        }

        if (Auth::guard($guard)->check() && auth()->user()->type == 'client'){
            return redirect('/client');
        }
        return $next($request);
}

【讨论】:

    【解决方案2】:

    您必须为每个 if 语句添加一个额外的检查,以查看您是否已经在它要重定向到的路线上

    可能是这样的:

    && $request->is('admin')
    

    【讨论】:

      【解决方案3】:

      只需拆分支票并保留原始回报:

           public function handle($request, Closure $next, $guard = null){
                   if (Auth::guard($guard)->check()){
      
                     if(Auth::user()->type == 'admin'){
                          return redirect('/admin');
                     }
                     if(Auth::user()->type == 'author'){
                          return redirect('/author');
                     }
                     if(Auth::user()->type == 'client'){
                          return redirect('/client');
                     }
                  }
                  return $next($request);
          }
      

      【讨论】:

      • @Gammer aaron 条件很好如果您在这些路由中没有来宾中间件admin, author and client..
      【解决方案4】:

      您可能误解了该中间件的用途。 RedirectIfAuthenticated 的目的是将用户重定向到他们的默认身份验证页面。这并不意味着阻止未经身份验证/未经授权的用户访问特定区域。

      如果未经授权,您需要做的是重定向。由于这是一个简单的案例,您可以只使用一个中间件:

      class RequireRole {
           public function handle($request, Closure $next, $role) {
                abort_unless(auth()->check() && auth()->user()->type == $role, 403, "You don't have permissions to access this area");
                 return $next($request);
           }
      }
      

      然后在你的Kernel.php注册这个中间件

      protected $routeMiddleware = [
              //Other middleware
              "requirerole" => RequireRole::class
      ];
      

      然后你可以在你的路线中使用它,例如

      Route::get('/admin', function () { /* action */ })->middleware("requirerole:admin");
      

      但是,如果您发现自己需要更复杂的规则,请查看 Authorization

      【讨论】:

        【解决方案5】:

        正如接受的答案所指出的,中间件的目的是在用户通过身份验证时重定向用户。

        现在,如果您检查 App\Http\Kernel.php,您将看到中间件附加到 guest 路由中间件变量。

        因此,任何您分配来宾中间件的路由都不会被经过身份验证的用户访问。

        要解决您的问题,请按照已接受的答案创建另一个中间点。

        如果未经授权,您需要做的是重定向。由于这是一个简单的案例,您可以 只要有一个中间件:

            public function handle($request, Closure $next, $role) {
                abort_unless(auth()->check() && auth()->user()->type == $role, 403, "You don't > have permissions to access this area");
                  return $next($request);
            }
        }
        

        然后在你的 Kernel.php 中注册这个中间件

              //Other middleware
               "requirerole" => RequireRole::class
        ];
        

        然后你可以在你的路线中使用它,例如

        Route::get('/admin', function () { /* action */ })->middleware("requirerole:admin");
        

        实际上,除非不可避免,否则您可能不需要修改 laravel 附带的默认文件。

        【讨论】:

          猜你喜欢
          • 2016-01-25
          • 2019-04-25
          • 2018-05-11
          • 1970-01-01
          • 1970-01-01
          • 2016-12-30
          • 2022-01-24
          • 1970-01-01
          • 2021-04-01
          相关资源
          最近更新 更多