Laravel-permission使用问题:角色授予场景下如何正确使用permissions表
问题解答
一、当前场景下permissions表的核心作用
- 解耦权限逻辑与角色绑定:避免硬编码角色判断规则,后续新增需要授权能力的角色时,无需修改Policy代码,仅需要给新角色分配对应权限即可生效。
- 支持动态配置权限:无需上线修改代码,仅通过后台操作权限分配即可调整不同角色的授权范围,比如后续需要放开admin授予admin角色的能力,直接给admin分配对应权限即可。
- 复用扩展包原生能力:可以直接使用Laravel-permission提供的
can()方法、@can刀片指令、权限中间件等原生能力,无需全量手写判断逻辑。 - 方便后续扩展细粒度权限:后续新增用户撤销、用户信息编辑等操作时,仅需新增对应权限分配给角色即可,不会出现Policy里堆满角色判断分支的问题。
二、适配Laravel-permission的调整方案
第一步:拆分细粒度授权权限
不要仅使用单一的grant-user权限,按照可授予的角色拆分创建对应权限:
grant-admin:允许授予admin角色grant-office-admin:允许授予office-admin角色grant-inspector:允许授予inspector角色
第二步:给对应角色分配权限
按照你的业务规则给角色分配上述权限:
- super-admin:分配
grant-admin、grant-office-admin、grant-inspector(也可以通过Laravel-permission的超级管理员豁免规则,不给super-admin分配任何权限就默认拥有所有权限) - admin:分配
grant-office-admin、grant-inspector - office-admin:分配
grant-inspector
第三步:改造UserPolicy的grant方法
改造后的逻辑优先走Laravel-permission的权限校验,再叠加办公区的业务逻辑判断:
public function grant(User $user, User $model, string $role) { // 配置角色与对应授权权限的映射,避免非法角色传入 $grantPermissionMap = [ User::ADMIN => 'grant-admin', User::OFFICE_ADMIN => 'grant-office-admin', User::INSPECTOR => 'grant-inspector', ]; // 非法角色直接拒绝 if (!isset($grantPermissionMap[$role])) { return false; } // 权限校验不通过直接拒绝 if (!$user->can($grantPermissionMap[$role])) { return false; } // 授予inspector角色额外校验同办公区 if ($role === User::INSPECTOR) { return $user->office->id === $model->office->id; } return true; }
附加优化建议
如果需要给super-admin开通所有权限无需单独分配,可以在app/Providers/AuthServiceProvider.php的boot方法中添加全局Gate前置判断:
Gate::before(function (User $user) { if ($user->isSuperAdmin()) { return true; } });
内容的提问来源于stack exchange,提问作者Anurat Chapanond
相关产品推荐
相关产品推荐

