Laravel 如果经过身份验证中间件则重定向

Gam*_*mer 1 php redirect laravel laravel-5 laravel-request

我的应用程序有三种类型的用户,每种类型都有自己的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');
    }
}
Run Code Online (Sandbox Code Playgroud)

它位于guest中间件之下。

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

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

apo*_*fos 6

您可能误解了该中间件的用途。的目的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);
     }
}
Run Code Online (Sandbox Code Playgroud)

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

protected $routeMiddleware = [
        //Other middleware
        "requirerole" => RequireRole::class
];
Run Code Online (Sandbox Code Playgroud)

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

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

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