以下描述基于Laravel开发。
我希望实现的功能的简要说明是,
有3种类型的用户。 Superadmin,Admin和Enduser。
只存在一个Superadmin,他可以同时创建管理员和最终用户。可以存在多个管理员,并为给定站点定义管理员。管理员可以创建多个Endusers。
为了方便上述使用案例,我应该在Laravel中采取什么样的方法?
到目前为止,我完成此操作的尝试是:
我实施了多个警卫然后我被困住了,因为有一些路由应该可供所有类型的用户访问。我无法通过多个警卫完成任务,因为如果我为一条路线定义了多个警卫,那么只有当所有多个用户类型都已登录时才能访问该路由。
说,我有一条由Superadmin和Admin保护的路线,只有当我以Superadmin身份登录时才能使用此路线。仅当Superadmin和Admin都已登录时,路由才可用。
似乎我们分配了多个警卫,警卫是 AND ed。但是我需要它们 OR ed。
保护任务:
Route::group(['middleware' => ['auth:superadmin', 'auth:admin']], function() {...
答案 0 :(得分:1)
根据您的逻辑,Superadmin始终是管理员,管理员也是最终用户。如果你从打开嵌套级别的路线开始,你可以像这样工作。
Route::group(['middleware' => ['auth:enduser']], function(){
// All the routes available for Enduser
// For Admin
Route::group(['middleware' => ['auth:admin']], function(){
// Give admin routes here
//Create group for SuperAdmin
Route::group(['middleware'=>['auth:superadmin']], function(){
// Super admin routes
});
});
});
这样,Superadmin就拥有了所有可用的东西。
答案 1 :(得分:1)
而不是Guards,我会将SuperAdmin,Admin和EndUser分离为执行简单角色检查的单个中间件。例如,SuperAdmin中间件:
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::user()->isSuperAdmin) {
return $next($request);
}
abort(404);
}
然后定期管理
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::user()->isSuperAdmin || Auth::user()->isAdmin) {
return $next($request);
}
abort(404);
}
然后最后对经过身份验证的用户进行简单检查,即EndUser
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::check()) {
return $next($request);
}
abort(404);
}
然后,您可以根据需要将中间应用于您的组。
Route::group(['middleware' => ['superadmin']], function() {...
Route::group(['middleware' => ['admin']], function() {...
Route::group(['middleware' => ['enduser']], function() {...
答案 2 :(得分:1)
我设法让它解决了。没有多重守卫。正如@anwerj指出的那样,所有用户都是ENDUSER
user_type
添加为User
模型的属性。 SUPERADMIN
,ADMIN
和ENDUSER
是三种用户类型。它与用户角色不同,因为用户可以承担多个角色,而一旦指定为ADMIN
的用户将永远ADMIN
,他可以拥有特殊权限。user_type
。用户角色可能有多个用户)permission_set
。 user_role
可以有多个permission_sets
当用户登录时,中间件会检查所请求的资源是否已授予User
。
答案 3 :(得分:1)
您可以将多个参数传递给这样的中间件。
$this->group(['middleware' => ['restricted.role:super-admin,admin']], function () {
// ...
});
RestrictedRole
中间件类handle
方法看起来像这样。
public function handle($request, Closure $next, ...$roles)
{
if (Auth::user()->inRoles($roles)) {
return response()->json(['error' => "You don't have access to that"], 401);
}
return $next($request);
}
最后,User
类将实现这样的inRole
方法。
public function inRoles($roles)
{
return in_array($this->getAttribute('role'), $roles);
}
您还可以像这样嵌套路由并进一步限制角色。
$this->group(['middleware' => ['restricted.role:super-admin,admin']], function () {
// super-admin and admin can access this block of routes.
$this->group(['middleware' => ['restricted.role:super-admin']], function () {
// Only super-admin can access this block of routes.
});
});