🍖RBAC 基于角色访问控制
一.RBAC介绍
1.什么是RBAC
- RBAC 是基于角色的访问控制 (Role-Based Access Control )
- 在 RBAC 中, 权限与角色相关联, 用户通过成为适当角色的成员而得到这些角色的权限
- 这就极大地简化了权限的管理, 这样管理都是层级相互依赖的, 权限赋予给角色, 而把角色又赋予用户, 这样的权限设计很清楚, 管理起来很方便
2.RBAC的应用
- Django的 Auth组件 采用的认证规则就是RBAC
- 专门做人员权限管理的系统(CRM系统), 公司内部使用, 数据量都在10w以下, 一般效率要求也不是很高
- 用户量极大的常规项目, 会分两种用户:前台用户(三大认证) 和 后台用户(使用RBAC来管理)
没有特殊要求的Django项目可以直接采用Auth组件的权限六表, 不需要自定义六个表, 也不需要断开表关系,单可能需要自定义User表
3.前台用户(三大认证)
- 前台指的不是前端, 而是普通用户所看到的界面, 使用认证、权限、频率来管理控制访问
- 简单来说 : 认证确定了你是谁
- 权限确定你能不能访问某个接口
- 限制确定你访问的某个接口的频率
4.后台用户(使用BRAC来管理)
- 后台指的是后台管理界面, 使用 RBAC 基于角色的访问控制
例如 :
- 普通员工只能访问某张表的某条记录
- 管理员或组长能对表和数据进行修改和新增等操作
- 老板能对所有数据拥有所有权限
二.RBAC的演变过程
1.用户与权限直接关联
- 也就是某个用户拥有某个权限, 这种结构能够很清晰的表现出用户和权限之间的关系
- 问题 : 以后随着人员增加, 每一个用户都需要重新授权或者朱七、王八离职之后, 需要针对每一个用户进行多种权限的回收, 繁琐
2.用户与权限之间添加角色
- 将用户进行分类, 加进不同的角色里边(相当于组的概念), 一个角色拥有某些权限, 具有统一角色的用户拥有相同的权限
- 一个用户也可以对应多个角色
三.RBAC表设计
1.三张表
- 用户表 : auth_user
- 角色表 : auth_group
- 权限表 : auth_permission
用户表与角色表通过外键与权限表关联
2.六张表
- 用户表 : auth_user
- 角色表 : auth_group
- 权限表 : auth_permission
- 角色和权限是多对多 : auth_group_permissions
- 用户和角色是多对多 : auth_user_groups
- 用户和权限的多对多表 : auth_user_user_permissions
四.实操
1.models.py 中写模型类, 扩写一下 auth_user 表
from django.contrib.auth.models import AbstractUser
# 为auth_user表增加phone字段
class UserInfo(AbstractUser):
phone = models.CharField(max_length=11, unique=True)
class Meta:
verbose_name_plural = '用户信息表'
def __str__(self):
return self.username
2.admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin
from drf_test import models
# 自定义User表后,admin界面管理User类
class UserAdmin(DjangoUserAdmin):
# 添加用户可操作字段
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('username', 'password', 'is_staff', 'phone', 'groups', 'user_permissions'),
}),
)
# 展示用户呈现的字段
list_display = ('username', 'phone', 'is_staff', 'is_active', 'is_superuser')
admin.site.register(models.UserInfo, UserAdmin)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现