我创建了两个名为“MustBeAdmin”和“MustBeUser”的中间件,以确保根据用户登录信息将其重定向到正确的页面并限制未经授权的内容。目前一切正常,重定向也很好。但我在幕后写的逻辑对我来说似乎不对,而且它仍然有效。如果我写出对我来说似乎正确的逻辑,它似乎没有按预期工作。
id (1,2,3,...)
name
role (1,2,3,...)
id (1,2,3,...)
role (Student, Admin,...)
public function handle($request, Closure $next)
{
if($request->user()->role == 2)
{
return $next($request);
}
else
{
return redirect('/admin/users');
}
}
public function handle($request, Closure $next)
{
if($request->user()->role == 1)
{
return $next($request);
}
else
{
return redirect('/admin/users');
}
}
'admin' => \App\Http\Middleware\MustBeAdmin::class,
'user' => \App\Http\Middleware\MustBeUser::class,
正如您所看到的,我已经在内核中注册了中间件。
我正在得到我需要的结果,但我怀疑中间件中的逻辑是否正确?
1 = Student
2 = Admin
如果你在MustBeAdmin中间件中看到我正在比较用户角色是2(管理员)然后做下一个($ request)而在MustBeUser中间件我正在比较用户角色是1(学生)然后做下一个($ request)和我将else设置为/ Admin目录。
我觉得它错了,你怎么看?
答案 0 :(得分:2)
您没有检查中间件中经过身份验证的用户详细信息。中间件应该是这样的:
//for student
public function handle($request, Closure $next)
{
if ( Auth::check() && Auth::user()->role == 1 )
{
return $next($request);
}
return redirect('/admin');
}
//for admin
public function handle($request, Closure $next)
{
if ( Auth::check() && Auth::user()->role == 2 )
{
return $next($request);
}
return redirect('/student');
}
您应该查看我对同一主题here
的详细答案答案 1 :(得分:1)
是的,它可以在一个公共文件中处理。 这是代码
public function handle($request, Closure $next)
{
$user = User::find(Auth::id());
$roles = [];
foreach ($user->roles as $key => $value) {
array_push($roles, $value->pivot->role_id);
}
$routeName = Route::getFacadeRoot()->current()->uri();
$route = explode('/', $routeName);
if ($route[0] == "teacher") {
if (in_array(2, $roles)) {
return $next($request);
} else {
return response('Unauthorized.', 401);
}
} elseif ($route[0] == "student") {
if (in_array(1, $roles)) {
return $next($request);
} else {
return response('Unauthorized.', 401);
}
} elseif ($route[0] == "admin") {
if (Auth::user()->admin == 1) {
return $next($request);
} else {
return response('Unauthorized.', 401);
}
} else {
if (!Auth::user()) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('admin-panel/auth/login');
}
}
}
return $next($request);
}
您可以根据需要改变逻辑。