Skip to content

Commit c59ae22

Browse files
committed
feat(role): enhance role hierarchy with parent-child relationships and effective permissions
1 parent 70c7f86 commit c59ae22

14 files changed

Lines changed: 1232 additions & 326 deletions

File tree

.gitattributes

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/.github export-ignore
22
/.tmp export-ignore
33
SECURITY.md export-ignore
4-
CONTRIBUTING.md export-ignore
4+
CONTRIBUTING.md export-ignore
5+
README*.md export-ignore

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,7 @@ public
2121
!web/public
2222
*.lock
2323
storage/swagger/http.json
24-
storage/uploads
24+
storage/uploads
25+
.bmad-core
26+
.claude
27+
CLAUDE.md

ROLE_HIERARCHY_README.md

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
# 角色层级与权限继承系统
2+
3+
## 概述
4+
5+
MineAdmin 已升级支持角色层级结构和权限继承,允许子角色自动继承父角色的所有权限。
6+
7+
## 核心特性
8+
9+
### 1. 角色层级结构
10+
- **单继承模式**:每个角色最多只能有一个父角色
11+
- **最大深度**:支持5级层级(0-4级)
12+
- **循环检测**:自动防止循环引用
13+
14+
### 2. 权限继承机制
15+
- **累积继承**:子角色拥有自己的权限 + 所有祖先角色的权限
16+
- **向上查找**:从当前角色开始,依次向上检查祖先角色权限
17+
- **SuperAdmin特殊处理**:超级管理员角色自动拥有所有权限
18+
19+
### 3. 多角色用户
20+
- **灵活组合**:用户可以拥有多个角色
21+
- **权限合并**:用户的最终权限 = 所有角色的有效权限合并
22+
23+
## 数据库结构
24+
25+
### 新增字段
26+
```sql
27+
ALTER TABLE role ADD COLUMN parent_id BIGINT NULL COMMENT '父角色ID';
28+
ALTER TABLE role ADD COLUMN level TINYINT DEFAULT 0 COMMENT '层级深度';
29+
```
30+
31+
### 层级示例
32+
```
33+
SuperAdmin (level=0)
34+
└── DeptManager (level=1)
35+
└── Employee (level=2)
36+
└── Intern (level=3)
37+
```
38+
39+
## API 使用示例
40+
41+
### Role 模型新增方法
42+
43+
```php
44+
use App\Model\Permission\Role;
45+
46+
$role = Role::find(1);
47+
48+
// 获取父角色
49+
$parent = $role->parent;
50+
51+
// 获取子角色
52+
$children = $role->children;
53+
54+
// 获取所有祖先角色
55+
$ancestors = $role->getAncestors();
56+
57+
// 获取所有后代角色
58+
$descendants = $role->getDescendants();
59+
60+
// 获取有效权限(含继承)
61+
$permissions = $role->getEffectivePermissions();
62+
63+
// 检查层级关系
64+
$isAncestor = $role->isAncestorOf($otherRole);
65+
$isDescendant = $role->isDescendantOf($otherRole);
66+
67+
// 检查循环引用
68+
$wouldCycle = $role->wouldCreateCycle($potentialParent);
69+
```
70+
71+
### User 模型权限检查
72+
73+
```php
74+
use App\Model\Permission\User;
75+
76+
$user = User::find(1);
77+
78+
// 检查权限(含继承)
79+
$hasPermission = $user->hasPermission('user.manage');
80+
81+
// 获取所有权限(含继承)
82+
$permissions = $user->getPermissions();
83+
```
84+
85+
### RoleHierarchyService 服务
86+
87+
```php
88+
use App\Service\Permission\RoleHierarchyService;
89+
90+
$service = new RoleHierarchyService();
91+
92+
// 设置父角色
93+
$service->setParent($childRole, $parentRole);
94+
95+
// 移动角色
96+
$service->moveRole($role, $newParent);
97+
98+
// 获取角色树
99+
$tree = $service->getRoleTree();
100+
101+
// 获取角色路径
102+
$path = $service->getRolePath($role); // 输出: "SuperAdmin > DeptManager > Employee"
103+
104+
// 重建层级结构
105+
$service->rebuildHierarchy();
106+
107+
// 删除角色
108+
$service->deleteRoleWithChildren($role, $moveChildrenUp = true);
109+
110+
// 获取可选父角色
111+
$availableParents = $service->getAvailableParents($role);
112+
```
113+
114+
## 权限继承示例
115+
116+
### 场景1:基本继承
117+
```
118+
SuperAdmin: [system.admin, user.manage, role.manage]
119+
├── DeptManager: [dept.manage]
120+
└── Employee: [profile.edit]
121+
```
122+
123+
权限分布:
124+
- SuperAdmin: [system.admin, user.manage, role.manage]
125+
- DeptManager: [system.admin, user.manage, role.manage, dept.manage]
126+
- Employee: [system.admin, user.manage, role.manage, dept.manage, profile.edit]
127+
128+
### 场景2:多角色用户
129+
```
130+
用户A拥有角色: [Employee, ProjectLead]
131+
最终权限 = Employee的有效权限 + ProjectLead的有效权限
132+
```
133+
134+
## 最佳实践
135+
136+
### 1. 角色设计
137+
- **按职能层级设计**:SuperAdmin → Manager → Employee → Intern
138+
- **避免过深层级**:建议不超过4级
139+
- **明确权限边界**:父角色权限应该包含子角色需要的基础权限
140+
141+
### 2. 权限分配
142+
- **最小权限原则**:只给必要的权限
143+
- **继承优先**:优先通过继承获取权限,减少直接分配
144+
- **定期审查**:定期检查权限是否合理
145+
146+
### 3. 性能优化
147+
- **缓存权限**:为频繁查询的用户缓存权限列表
148+
- **控制层级深度**:避免过深的递归查询
149+
- **索引优化**:为parent_id和level字段建立索引
150+
151+
## 迁移指南
152+
153+
### 1. 运行迁移
154+
```bash
155+
php bin/hyperf.php migrate
156+
```
157+
158+
### 2. 设置现有角色层级
159+
```php
160+
// 设置现有角色的父级关系
161+
$superAdmin = Role::where('code', 'SuperAdmin')->first();
162+
$manager = Role::where('code', 'Manager')->first();
163+
$employee = Role::where('code', 'Employee')->first();
164+
165+
$hierarchyService = new RoleHierarchyService();
166+
$hierarchyService->setParent($manager, $superAdmin);
167+
$hierarchyService->setParent($employee, $manager);
168+
```
169+
170+
### 3. 验证权限继承
171+
```php
172+
// 测试权限继承是否正常工作
173+
$user = User::find(1);
174+
$hasPermission = $user->hasPermission('system.admin');
175+
```
176+
177+
## 兼容性说明
178+
179+
### 向后兼容
180+
- ✅ 现有的权限检查逻辑完全兼容
181+
- ✅ 现有的用户-角色关联不受影响
182+
- ✅ API接口保持不变
183+
184+
### 新增功能
185+
- 🆕 角色层级管理
186+
- 🆕 权限继承机制
187+
- 🆕 循环引用检测
188+
- 🆕 层级路径显示
189+
190+
## 故障排除
191+
192+
### 常见问题
193+
194+
1. **权限继承不生效**
195+
- 检查角色的parent_id是否正确设置
196+
- 检查level字段是否正确计算
197+
- 使用`rebuildHierarchy()`重建层级结构
198+
199+
2. **循环引用错误**
200+
- 使用`wouldCreateCycle()`检查是否会产生循环
201+
- 检查数据的完整性
202+
203+
3. **性能问题**
204+
- 为parent_id字段添加索引
205+
- 启用权限缓存机制
206+
- 控制角色层级深度
207+
208+
### 调试工具
209+
210+
```php
211+
// 打印角色层级树
212+
$tree = app(RoleHierarchyService::class)->getRoleTree();
213+
print_r($tree->toArray());
214+
215+
// 检查用户的完整权限
216+
$user = User::find(1);
217+
$permissions = $user->getPermissions();
218+
foreach ($permissions as $permission) {
219+
echo $permission->name . "\n";
220+
}
221+
```
222+
223+
## 总结
224+
225+
角色层级与权限继承系统为MineAdmin提供了更灵活和强大的权限管理能力,同时保持了向后兼容性。通过简单的单继承树形结构,实现了复杂权限场景的简洁管理。

app/Command/UpdateCommand.php

Lines changed: 0 additions & 64 deletions
This file was deleted.

0 commit comments

Comments
 (0)