Skip to content

角色管理

使用说明

主界面

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

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

image-20250617155845448

菜单权限界面

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

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

image-20250617161905621

TIP

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

数据权限界面

角色的数据权限分为5种

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

数据权限计算方式:并集。举例如下:

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

image-20250617162035183

TIP

数据权限的实现原理,详见《后端手册——数据权限》

权限使用建议

为便于权限核算与管理,建议遵循以下配置原则:

  1. 细化角色粒度:拆分角色并为每个角色分配最小范围的权限集合
  2. 分离权限类型:角色权限单一化,每个角色仅配置菜单权限数据权限,避免混合配置
  3. 组合角色授权:为用户按需叠加分配多个角色,通过角色组合满足业务权限需求

配置示例

需求:用户张三仅可使用资产管理相关功能菜单,且仅能管理所属部门的数据

配置步骤:

  1. 新建角色 「资产管理菜单角色」:绑定资产管理相关功能菜单的访问权限,数据权限默认配置为「仅本人数据权限」
  2. 配置内置角色 「部门管理员」:菜单权限置空,数据权限配置为「本部门数据权限」
  3. 为用户张三同时分配「资产管理菜单角色」与「部门管理员」两个角色

注意

若角色或用户的权限发生变更,受影响的用户需退出系统并重新登录,权限变更才能生效

后端实现

目录

代码目录: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 # 主界面