如何在Laravel中使用自定义中间件检查用户权限

时间:2018-07-03 12:07:40

标签: php laravel laravel-middleware

我正在开发Laravel ACL系统。我的基本表是mongodb://mongodb:27017/my-app,数据透视表是users,roles,permissions

我想使用我的自定义中间件role_user,role_permission,user_permission检查用户权限。我已经尝试过这种方法,但是无法正常工作。每个用户都可以访问所有拥有或没有的权限。

现在,我该如何解决该问题。请参阅我的代码示例。

我的控制器。

HasPermission

我的中间件。

function __construct()
{
    $this->middleware('auth');
    $this->middleware('HasPermission:Role_Read|Role_Update|Role_Delete');
}

,还有我的class HasPermission { public function handle($request, Closure $next,$permissions) { $permissions_array = explode('|', $permissions); // $user = $this->auth->user(); foreach($permissions_array as $permission){ if(!$request->user()->hasPermission($permission)){ return $next($request); } } return redirect()->back(); } } 模型方法。

User

3 个答案:

答案 0 :(得分:0)

最好的方法是,您需要引入新的服务提供商,并且可以检查授权和权限。

我为去年的数据库驱动许可做了一个测试项目,并使用了服务提供商。

那是实现的完美方法。

答案 1 :(得分:0)

基本上,!$request->user()->hasPermission($permission)表示如果与请求关联的用户没有此权限,则中间件将通过,但这不是您想要的。这是您应该做的:

如果您需要用户拥有一个规定的权限,则需要执行以下操作:

class HasPermission
{

    public function handle($request, Closure $next,$permissions)
    {

        $permissions_array = explode('|', $permissions);
        foreach($permissions_array as $permission){
            if ($request->user()->hasPermission($permission)){
                return $next($request);
            }
        }    
       return redirect()->back();    
    }
}

如果您希望用户拥有所有所述的权限,则需要执行以下操作:

class HasPermission
{

    public function handle($request, Closure $next,$permissions)
    {

        $permissions_array = explode('|', $permissions);
        foreach($permissions_array as $permission){
            if (!$request->user()->hasPermission($permission)){
                return redirect()->back();                        
            }
        }    
        return $next($request);
    }
}

作为补充说明,如果您想以更优雅的方式执行此操作,则可以这样做:

class HasPermission
{

    public function handle($request, Closure $next, ...$permissions_array)
    {    
       //Function body from above without the explode part
    }
}

还有

function __construct()
{
   $this->middleware('auth');
   $this->middleware('HasPermission:Role_Read,Role_Update,Role_Delete');
}

如果使用逗号,则框架会将字符串拆分为参数。

答案 2 :(得分:0)

就我而言,我只是添加了简单的功能来从数据库获取权限,然后检查它为中间件。检查此代码:

//添加新功能以从数据库获取权限

public static function user_permissions($user) {

$permissions=DB::table('permissions')->where('user_id', $user)->first();
return $permissions; 

}

//在中间件中检查您的权限

   if(Auth::guest())
    {
        return redirect('/');
    }

elseif(Functions::user_permissions(Auth::user()->id)->user_managment != 1) {

 return redirect('/');

} else {
    return $next($request);
}