Laravel多种用户类型

时间:2017-06-17 08:17:56

标签: php authentication laravel-5.4

以下描述基于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() {...

4 个答案:

答案 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

  1. user_type添加为User模型的属性。 SUPERADMINADMINENDUSER是三种用户类型。它与用户角色不同,因为用户可以承担多个角色,而一旦指定为ADMIN的用户将永远ADMIN,他可以拥有特殊权限。
  2. 实施授权机制,可以授予路径
    • 到单个用户(即只有授权用户可以访问特定路由)或
    • 到用户角色(不是上面提到的user_type。用户角色可能有多个用户)
  3. 路线分组为permission_setuser_role可以有多个permission_sets
  4. 当用户登录时,中间件会检查所请求的资源是否已授予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.
    });
});