🍖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,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!