我有三种类型的应用程序用户,每个用户都有自己的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
。
我做错了什么,处理它的最佳方法是什么。
答案 0 :(得分:2)
您可能误解了该中间件的用途。 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
答案 1 :(得分:0)
需要稍微修改一下代码
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 :(得分:0)
您必须为每个if语句添加额外的检查,以查看您是否已经在它将重定向到
的路线上可能是这样的:
&& $request->is('admin')
答案 3 :(得分:0)
只需拆开支票并保留原始退货:
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);
}
答案 4 :(得分:0)
正如接受的答案中指出的那样,中间件的目的是在用户通过身份验证时重定向用户。
现在,如果您选中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随附的默认文件。