Skip to content

RBAC权限

RBAC权限

介绍

RBAC(Role-Based Access Control,基于角色的访问控制)是一种广泛使用的权限管理模型,它通过角色来管理用户权限,简化了权限分配和维护的复杂度。在企业级应用中,RBAC 模型可以帮助管理员更高效地管理用户访问权限。

RBAC 的三个核心组件

  • 用户(User):系统中的参与者,例如员工、客户等。用户通过登录系统来访问资源。
  • 角色(Role):一组权限的集合,代表了用户在系统中的职责或身份。例如,“管理员”角色可能拥有对系统所有资源的完全访问权限,而“普通用户”角色可能只能访问有限的资源。
  • 权限(Permission):允许用户对资源执行的操作,例如菜单按钮对应的“读”、“写”、“删除”等。权限是RBAC模型中的最小控制单元。

RBAC的工作原理

  • 角色分配:将用户分配到一个或多个角色。这种分配通常基于用户的职责、部门或工作性质。例如,一个员工可能被分配到“财务部门员工”角色和“系统用户”角色。
  • 权限分配:将权限分配给角色。一旦角色被分配了权限,所有属于该角色的用户都将继承这些权限。例如,为“管理员”角色分配“创建用户”、“修改用户”和“删除用户”的权限。
  • 访问请求:当用户尝试访问资源时,系统会检查用户所属的角色以及角色所拥有的权限。如果用户的角色具有相应的权限,则允许访问;否则,拒绝访问。

RBAC 的核心思想

  • 用户通过角色获得权限,而不是直接分配权限给用户。这种间接授权方式使得权限管理更加灵活和可扩展。

数据库设计

image-20250623104546013

自定义权限类

DRF 中,权限类是控制用户对 API 资源访问的核心机制。自定义权限类需要继承 rest_framework.permissions.BasePermission,并实现以下一个或两个方法

  • has_permission(self, request, view):检查视图权限,例如视图的增删改查权限
  • has_object_permission(self, request, view, obj):检查对象级权限

权限类的基本概念

  • 权限类:是 DRF 中用于检查请求是否被允许访问特定资源的组件
  • 返回值:权限类返回 TrueFalse,决定请求是否被授权
  • 执行顺序:权限检查在认证之后、视图逻辑执行之前进行

自定义权限类

  • 文件:mysite\mars_framework\permissions\base.py
  • 从缓存中获取当前请求用户的权限标识集合,然后对比本次请求的权限标识(如 "system:post:query")。如果包含在集合中,则返回true,否则返回false

image-20250623113039283

在视图中使用自定义权限类

例如:岗位管理中,视图文件mysite\myapp_system\post\views.py,指定了增删改查等操作所需要的权限。

image-20250623113512503

用户登录

登录流程

文件mysite\myapp_system\auth\views.pylogin,定义了用户使用账号密码登录登录流程

  1. 校验验证码(如果启用)
  2. 校验用户名与密码
  3. 检验用户状态
    • 如果都通过,异步记录登录成功日志
    • 如果不通过,异步记录登录失败日志

image-20250623141334376

权限获取

文件mysite\myapp_system\auth\views.pyget_permission_info,定义了获取登录用户的权限信息流程

  1. 用户成功登录后,前端会自动调用该接口,获取登录用户的权限信息,包括
    • 用户基本信息 user
    • 用户角色集合 roles
    • 用户权限标识集合 permissions(上一节中提到,自定义权限类进行权限判断)
    • 用户树状菜单集合 menus
  2. 收集到上述权限信息后,写入Redis缓存,并返回给前端

image-20250623141355904

TIP

RBAC权限验证依赖Redis作为缓存,保证Redis服务正常