Skip to content

角色管理

使用说明

主界面

角色类型:内置角色不能编辑、删除、修改数据权限,可以修改菜单权限

内置角色名称固定的数据权限
超级管理员全部数据权限
普通角色仅本人数据权限
部门管理员本部门数据权限
部门及以下管理员本部门及以下数据权限

image-20250617155845448

菜单权限界面

设置角色的菜单权限:勾选相应菜单/按钮,则该角色的用户能看到相应的菜单/按钮

  • 菜单权限计算方式:并集
    • 举例:用户同时属于角色A和角色B,则该用户拥有角色A和B的菜单权限

image-20250617161905621

TIP

菜单权限的实现原理,详见《后端手册——RBAC权限》

数据权限界面

设置角色的数据权限范围,分为5种权限

  • 仅本人数据权限
  • 本部门及以下数据权限
  • 本部门数据权限
  • 指定部门数据权限
  • 全部数据权限

数据权限计算方式:本人数据+部门数据权限的并集。举例如下:

用户分配的角色用户数据权限计算结果
用户没有分配角色本人数据权限
用户同时属于角色A(本部门数据权限)和角色B(本部门及以下数据权限)本人数据+指定部门数据+本部门及以下数据权限
用户同时属于角色C(指定部门数据权限)和角色B(本部门及以下数据权限)本人数据+指定部门数据+本部门及以下数据权限
用户分配的角色中任意一个为“全部数据权限”全部数据权限

image-20250617162035183

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方法:判断如果是内置角色,则不能修改

image-20250618093747287

前端实现

目录

  • 代码目录:src\views\system\role
sh
role
|-- RoleAssignMenuForm.vue # 菜单权限界面
|-- RoleDataPermissionForm.vue # 数据权限界面
|-- RoleForm.vue # 编辑界面
`-- index.vue # 主界面