外观
角色管理
使用说明
主界面
角色类型:内置角色不能编辑、删除、修改数据权限,可以修改菜单权限
内置角色名称 | 固定的数据权限 |
---|---|
超级管理员 | 全部数据权限 |
普通角色 | 仅本人数据权限 |
部门管理员 | 本部门数据权限 |
部门及以下管理员 | 本部门及以下数据权限 |
菜单权限界面
设置角色的菜单权限:勾选相应菜单/按钮,则该角色的用户能看到相应的菜单/按钮
- 菜单权限计算方式:并集
- 举例:用户同时属于角色A和角色B,则该用户拥有角色A和B的菜单权限
TIP
菜单权限的实现原理,详见《后端手册——RBAC权限》
数据权限界面
设置角色的数据权限范围,分为5种权限
- 仅本人数据权限
- 本部门及以下数据权限
- 本部门数据权限
- 指定部门数据权限
- 全部数据权限
数据权限计算方式:本人数据+部门数据权限的并集。举例如下:
用户分配的角色 | 用户数据权限计算结果 |
---|---|
用户没有分配角色 | 本人数据权限 |
用户同时属于角色A(本部门数据权限)和角色B(本部门及以下数据权限) | 本人数据+指定部门数据+本部门及以下数据权限 |
用户同时属于角色C(指定部门数据权限)和角色B(本部门及以下数据权限) | 本人数据+指定部门数据+本部门及以下数据权限 |
用户分配的角色中任意一个为“全部数据权限” | 全部数据权限 |
TIP
数据权限的实现原理,详见《后端手册——数据权限》
权限使用建议
为方便权限的计算,建议:
- 多建角色,每个角色分配小范围的权限。
- 多建角色,每个角色只分配菜单权限,或数据权限。
- 用户按需分配多个角色
示例:用户张三只能使用资产管理相关功能菜单,并且该用户能管理所属部门的数据
- 新建角色“资产管理菜单角色”,设置菜单权限关联资产管理相关功能菜单,设置数据权限为默认的“仅本人数据权限”
- 内置角色“部门管理员”,设置菜单权限为空,数据权限默认为“本部门数据权限”
- 为用户张三分配“资产管理菜单角色”和“部门管理员”
TIP
如果角色对应的菜单或数据权限发生变更,受影响的用户需要退出重新登录才生效
后端实现
目录
代码目录:mysite\myapp_system\role
sh
role
|-- filters.py # 搜索过滤
|-- models.py # 模型
|-- serializers.py # 序列化器
|-- services.py # 工具函数和类
`-- views.py # 视图
模型
角色模型SystemRole
继承了BaseModel
menus
定义了与菜单多对多关系SystemRoleMenu
是角色与菜单的多对多关系中间表
python
class SystemRole(BaseModel):
id = models.BigAutoField(primary_key=True, db_comment="角色ID", help_text="角色ID")
name = models.CharField(max_length=30, db_comment="角色名称", help_text="角色名称")
# ...
menus = models.ManyToManyField(
"SystemMenu",
through="SystemRoleMenu",
through_fields=("role_id", "menu_id"),
related_name="roles",
)
# ...
视图
角色视图RoleViewSet
继承了CustomModelViewSet
- 重写了
destroy
方法:判断如果是内置角色,则不能删除 - 重写了
update
方法:判断如果是内置角色,则不能修改
前端实现
目录
- 代码目录:
src\views\system\role
sh
role
|-- RoleAssignMenuForm.vue # 菜单权限界面
|-- RoleDataPermissionForm.vue # 数据权限界面
|-- RoleForm.vue # 编辑界面
`-- index.vue # 主界面