外观
RBAC权限
RBAC权限
介绍
RBAC(Role-Based Access Control,基于角色的访问控制)是一种广泛使用的权限管理模型,它通过角色来管理用户权限,简化了权限分配和维护的复杂度。在企业级应用中,RBAC 模型可以帮助管理员更高效地管理用户访问权限。
RBAC 的三个核心组件
- 用户(User):系统中的参与者,例如员工、客户等。用户通过登录系统来访问资源。
- 角色(Role):一组权限的集合,代表了用户在系统中的职责或身份。例如,“管理员”角色可能拥有对系统所有资源的完全访问权限,而“普通用户”角色可能只能访问有限的资源。
- 权限(Permission):允许用户对资源执行的操作,例如菜单按钮对应的“读”、“写”、“删除”等。权限是RBAC模型中的最小控制单元。
RBAC的工作原理
- 角色分配:将用户分配到一个或多个角色。这种分配通常基于用户的职责、部门或工作性质。例如,一个员工可能被分配到“财务部门员工”角色和“系统用户”角色。
- 权限分配:将权限分配给角色。一旦角色被分配了权限,所有属于该角色的用户都将继承这些权限。例如,为“管理员”角色分配“创建用户”、“修改用户”和“删除用户”的权限。
- 访问请求:当用户尝试访问资源时,系统会检查用户所属的角色以及角色所拥有的权限。如果用户的角色具有相应的权限,则允许访问;否则,拒绝访问。
RBAC 的核心思想
- 用户通过角色获得权限,而不是直接分配权限给用户。这种间接授权方式使得权限管理更加灵活和可扩展。
数据库设计
自定义权限类
DRF 中,权限类是控制用户对 API 资源访问的核心机制。自定义权限类需要继承 rest_framework.permissions.BasePermission
,并实现以下一个或两个方法
has_permission(self, request, view)
:检查视图权限,例如视图的增删改查权限has_object_permission(self, request, view, obj)
:检查对象级权限
权限类的基本概念
- 权限类:是 DRF 中用于检查请求是否被允许访问特定资源的组件
- 返回值:权限类返回
True
或False
,决定请求是否被授权 - 执行顺序:权限检查在认证之后、视图逻辑执行之前进行
自定义权限类
- 文件:
mysite\mars_framework\permissions\base.py
- 从缓存中获取当前请求用户的权限标识集合,然后对比本次请求的权限标识(如 "system:post:query")。如果包含在集合中,则返回
true
,否则返回false
。
在视图中使用自定义权限类
例如:岗位管理中,视图文件mysite\myapp_system\post\views.py
,指定了增删改查等操作所需要的权限。
用户登录
登录流程
文件mysite\myapp_system\auth\views.py
中login
,定义了用户使用账号密码登录登录流程
- 校验验证码(如果启用)
- 校验用户名与密码
- 检验用户状态
- 如果都通过,异步记录登录成功日志
- 如果不通过,异步记录登录失败日志
权限获取
文件mysite\myapp_system\auth\views.py
中get_permission_info
,定义了获取登录用户的权限信息流程
- 用户成功登录后,前端会自动调用该接口,获取登录用户的权限信息,包括
- 用户基本信息 user
- 用户角色集合 roles
- 用户权限标识集合 permissions(上一节中提到,自定义权限类进行权限判断)
- 用户树状菜单集合 menus
- 收集到上述权限信息后,写入Redis缓存,并返回给前端
TIP
RBAC权限验证依赖Redis作为缓存,保证Redis服务正常