Laravel 5.4 管理员和用户角色的中间件
Laravel 5.4 Middleware for Admin and User Role
我创建了两个名为 "MustBeAdmin" 和 "MustBeUser" 的中间件,以确保根据用户登录将他们重定向到正确的页面并限制未经授权的内容。目前一切正常,重定向也很好。但是我在幕后写的逻辑对我来说似乎是错误的,而且它仍然有效很奇怪。如果我至少写了对我来说似乎正确的逻辑,它似乎并没有按预期工作。
用户table
id (1,2,3,...)
name
role (1,2,3,...)
角色table
id (1,2,3,...)
role (Student, Admin,...)
MustBeAdmin 中间件
public function handle($request, Closure $next)
{
if($request->user()->role == 2)
{
return $next($request);
}
else
{
return redirect('/admin/users');
}
}
MustBeUser 中间件:
public function handle($request, Closure $next)
{
if($request->user()->role == 1)
{
return $next($request);
}
else
{
return redirect('/admin/users');
}
}
kernel.php
'admin' => \App\Http\Middleware\MustBeAdmin::class,
'user' => \App\Http\Middleware\MustBeUser::class,
如你所见,我已经在内核中注册了中间件。
我得到的结果正是我需要的,但我怀疑中间件中的逻辑是否正确?
1 = Student
2 = Admin
如果您在 MustBeAdmin 中间件中看到我正在比较用户角色是否为 2(管理员)然后执行下一步($request),在 MustBeUser 中间件中我正在比较如果用户角色为 1(学生)然后执行下一步($request ) 然后我将其他设置为 /Admin 目录。
我觉得不对,你觉得呢?
您没有在中间件中检查经过身份验证的用户详细信息。中间件应该是这样的:
//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
是的,它可以在一个公共文件中处理。
这是代码
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);
}
您可以根据需要更改逻辑。
我创建了两个名为 "MustBeAdmin" 和 "MustBeUser" 的中间件,以确保根据用户登录将他们重定向到正确的页面并限制未经授权的内容。目前一切正常,重定向也很好。但是我在幕后写的逻辑对我来说似乎是错误的,而且它仍然有效很奇怪。如果我至少写了对我来说似乎正确的逻辑,它似乎并没有按预期工作。
用户table
id (1,2,3,...)
name
role (1,2,3,...)
角色table
id (1,2,3,...)
role (Student, Admin,...)
MustBeAdmin 中间件
public function handle($request, Closure $next)
{
if($request->user()->role == 2)
{
return $next($request);
}
else
{
return redirect('/admin/users');
}
}
MustBeUser 中间件:
public function handle($request, Closure $next)
{
if($request->user()->role == 1)
{
return $next($request);
}
else
{
return redirect('/admin/users');
}
}
kernel.php
'admin' => \App\Http\Middleware\MustBeAdmin::class,
'user' => \App\Http\Middleware\MustBeUser::class,
如你所见,我已经在内核中注册了中间件。
我得到的结果正是我需要的,但我怀疑中间件中的逻辑是否正确?
1 = Student
2 = Admin
如果您在 MustBeAdmin 中间件中看到我正在比较用户角色是否为 2(管理员)然后执行下一步($request),在 MustBeUser 中间件中我正在比较如果用户角色为 1(学生)然后执行下一步($request ) 然后我将其他设置为 /Admin 目录。
我觉得不对,你觉得呢?
您没有在中间件中检查经过身份验证的用户详细信息。中间件应该是这样的:
//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
是的,它可以在一个公共文件中处理。 这是代码
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);
}
您可以根据需要更改逻辑。