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。
我做错了什么,最好的处理方法是什么。
您可能误解了该中间件的用途。的目的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)
但是,如果您发现自己需要更复杂的规则,请查看授权