当前位置: 首页 > 知识库问答 >
问题:

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

施雅懿
2023-03-14

我正在开发一个Laravel ACL系统。我的基本表是用户、角色、权限,透视表是角色用户、角色权限、用户权限

我想使用我的自定义中间件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();

 }
}

还有,我的用户模型方法。

public function user_permissions()
{
    return $this->belongsToMany(Permission::class,'user_permission');
}

public function hasPermission(string $permission)
{
    if($this->user_permissions()->where('name', $permission)->first())
    {
        return true;
    }
    else
    {
        return false;
    }

}

共有3个答案

唐星晖
2023-03-14

在我的例子中,我只是添加了一个简单的函数来从数据库获取权限,然后检查它。检查此代码:

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

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);
}
林魁
2023-03-14

基本上$请求-

如果您需要用户具有指定的权限之一,您需要执行以下操作:

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');
}

如果您使用逗号,那么框架将为您将字符串拆分为参数。

岳亮
2023-03-14

最好的方法是,您需要引入一个新的服务提供商,这样您就可以检查授权和权限。

我做了一个db驱动权限的测试项目(去年),我使用了服务提供商。

这是实现的最佳方式。

 类似资料:
  • 我有一个简单的中间件,它检查用户会话中是否有密钥。 问题是我总是得到“未按请求设置会话存储”错误这是我的路线: 我在app\Http\K中添加了中间件ernel.php变量$middleware 我也试着改变我的路线: 但这不起作用。知道如何确保会话已经启动,或者在调用中间件之前启动它吗?我用的是Laravel 5.3

  • 现在,我正在使用类似的方法来验证我的基本站点上的用户: 如何修改使用自定义列作为用户名的代码?https://laravel.com/docs/5.3/passport#password-grant-tokens

  • 问题内容: 在将旧版应用程序迁移到Spring Security时,出现以下异常: 在旧的应用程序中,角色有“超级管理员”,“编辑者”,“帮助台”等。但是在所有Spring Security示例中,我仅看到诸如“ ROLE _”(“ ROLE_ADMIN”等)的角色。当我将“ superadmin”重命名为“ ROLE_ADMIN”并且仅在配置中使用此角色时,一切正常。 不起作用: 作品: 可以使

  • 我已经创建了一个新的中间件名称Adminpanel 和注册中间件 和路线 }); 但当我运行时,它要求我尝试获取非对象的属性,这意味着我不能在这里访问Auth类,有人能告诉我错误是什么以及如何在中间件中访问Auth Facade吗。 这是我的身份验证码 谢谢

  • 嗨,我对auth()有问题- 这里是一个简单的服务提供商 一条简单的路线。 我在Kernel.php注册了中间件 然后我只是在aController.php中调用_构造函数 我知道名字是愚蠢的名字,但这只是一个例子,我只是在学习。 谢谢你的回答。 PS:所有这些文件都在/vendor文件夹中 即使在_构造函数(){$This中使用,也会发生这种情况-

  • 我有一个Laravel5.4应用程序,在其中我必须通过外部API验证我的管理员用户,当成功登录时,它会返回一个包含用户信息的JSON。 我正在创建一个自定义保护,使此: 这是我的定制提供商: 在那之后,我不知道如何继续。我读过一些教程,比如George Buckingham的教程,我创建了一个自定义用户提供程序(现在我只需要它从EloquentUserProvider扩展,最终我将覆盖一些函数以连