Laravel多条件角色权限配置:多层级公司员工管理场景
多层级员工管理系统角色权限落地方案
抛弃User表加外键字段、单组织节点建独立权限项的思路,采用固定角色+管辖范围关联表+层级路径匹配的架构,低维护成本适配所有需求场景。
核心数据模型设计
所有表结构保持精简,不做冗余设计:
- 统一组织架构表(不拆分部门、子部门为独立表,后续扩展层级无需改表)
核心字段:id:组织节点唯一IDparent_id:父级节点ID,部门节点的parent_id关联公司ID,子部门节点的parent_id关联所属部门IDtype:节点类型枚举,值为division(部门)/subdivision(子部门)path:核心索引字段,存储当前节点的完整层级路径,例:ID为2的部门path为/2/,其下属ID为5的子部门path为/2/5/name:组织名称
- 固定角色表:仅预置4个业务角色,无需动态新增
核心字段:id:角色唯一IDrole_key:角色标识枚举,值为super_admin/manager/coordinator/group_leaderrole_name:角色显示名
- 用户角色关联表:支持单用户绑定多角色,核心字段为
user_id、role_id - 用户管辖范围关联表(解决多组织管辖问题的核心表,无需为每个组织建独立权限项)
核心字段:user_id、org_id(关联组织架构表ID)
说明:该表仅存储用户直接绑定的管辖顶层节点,无需冗余存储所有下属节点,例:协调员管辖2个部门,仅需插入2条对应部门节点的绑定记录,下属子部门、员工通过路径匹配自动纳入管辖范围 - 员工表:核心字段为
id、account_user_id(关联系统登录账号ID)、org_id(归属子部门ID)
权限范围判定规则
所有角色默认拥有管辖范围内的完整CRUD权限,无需单独配置操作权限,仅需在数据访问层校验操作对象是否在用户管辖范围内:
- 超级管理员:绑定
super_admin角色后直接跳过范围校验,拥有全量数据操作权限,无需在管辖范围表插入记录 - 经理:绑定
manager角色,管辖范围表仅插入其所属单个部门的节点ID。校验逻辑:操作对象所属组织的path以该部门节点的path为前缀,即判定有权限,自动覆盖部门下所有子部门、子部门归属员工 - 协调员:绑定
coordinator角色,管辖范围表插入其有权管辖的1个或多个部门节点ID。校验逻辑与经理一致,只要操作对象的组织path命中任意一个绑定部门的path前缀,即判定有权限,自动覆盖所有绑定部门下的子部门、员工 - 组长:绑定
group_leader角色,管辖范围表插入其有权管辖的1个或多个子部门节点ID。校验逻辑:操作对象所属组织的path以任意一个绑定子部门的path为前缀,即判定有权限,支持跨部门选子部门的管辖需求
实现示例:查询当前用户有权查看的所有子部门时,超级管理员直接查全表;其余角色先查出自身绑定的所有管辖节点的path集合,拼接查询条件为
WHERE path LIKE '/绑定节点1/%' OR path LIKE '/绑定节点2/%',一次查询即可捞出所有有权限的数据,无需递归遍历组织树,查询性能高。
方案优势
- 天然适配单用户管辖多个部门、多个跨部门子部门的场景,无需在User表新增大量组织关联字段
- 权限项维护成本为0,不管新增多少部门、子部门,仅需在组织架构表新增节点记录,给对应用户在管辖范围表新增绑定关系即可,无需给每个组织节点单独创建权限项
- 架构扩展性强,后续如果要在子部门下新增小组、工作组等更深层级,仅需给新节点生成对应path,完全不用调整权限判定逻辑
- 校验逻辑统一,除超级管理员外,其余角色的权限判定完全复用同一套路径匹配规则,无需针对单个角色写特殊判断分支,代码维护成本低
关键实现注意点
- 组织架构表的
path字段必须建索引,保证前缀匹配查询的性能 - 组织节点调整归属(比如把子部门从A部门划转至B部门)时,必须同步更新该节点及其所有下属节点的path值,避免权限匹配错误
- 在数据访问层加全局拦截器,自动拼接当前用户的管辖范围查询条件,无需在每个业务接口单独写权限校验逻辑,避免漏校验
- 无需额外配置CRUD类操作权限,符合所有角色在管辖范围内拥有完整操作权限的需求,减少无意义的配置项
内容的提问来源于stack exchange,提问作者Guev4ra
相关产品推荐
相关产品推荐

