一
RBAC(Role-Base Access Control),译作:基于角色分配的访问控制机制。实现了权限认证机制以后,我们可以让不同的用户得到不同的权限,基于用户拥有的权限不同,能操作的功能或者能看到的站点内容也会产生不一样。
一般用于项目权限的分配机制无非3种:RBAC,OAuth授权认证、RLS(Row Level Security的缩写、译作:行级数据安全)。
在网站后台运营站点这种单个站点内部,单个站点集群场景下,一般使用的都是RBAC。
在对外开发的业务站点中,基于不同的渠道,不同的领域,不同站点之间,一般都是使用OAuth2.0授权认证。
在对外开发的站点服务,如果配置多台前后台的租赁模式,多数使用RLS权限机制。
因为项目业务的复杂程度不一致。所以存在有3表RBAC或5表RBAC的实现方案。
描述 | 视图 | |
3表RBAC认证 |
使用了3张表保存了权限相关的所有数据,这3张表分别是用户表(user),角色表(role/group/department),权限表(permission/auth。 常见的场景:单个网站:小论坛,小商城,普通的后台站点。 |
![]() |
5表RBAC认证 |
在3表的基础上新增了2张关系表保存权限相关的所有数据,这5张表分别是用户表(user),角色表(role/group),权限表(permission/auth), 以及新增的2张关系表:用户与角色之间的关系表(user_group)和角色与权限的关系表(group_permission)。 常见的业务场景:大型综合论坛,大型的商城(商家入驻),有分公司的企业内部站点,OA、ORM、ERP、权限系统。 |
![]() |
描述 | 视图 | |
django的RBAC |
在传统的5表RBAC基础上,增加了一个关系表,用户与权限之间的关系表(user_permission)。 因为RBAC的本质是用户随着角色不同,而拥有不同的权限,而django的admin站点中,允许针对某一个用户,可以单独分配权限的。
|
![]() |
1 | python manage.py createsuperuser |
2 注册模型类
admin.py
1 2 3 4 5 6 | from django.contrib import admin from .models import Student, Course, Lecturer admin.site.register(Student) admin.site.register(Course) admin.site.register(Lecturer) |
module.py

from django.db import models class Student(models.Model): """学生信息""" SEX_CHOICES = ( (0, "女生"), (1, "男生"), ) name = models.CharField(max_length=20, db_index=True, verbose_name="姓名", help_text='姓名') age = models.SmallIntegerField(verbose_name="年龄",help_text="年龄") avatar = models.ImageField(upload_to="avatar/%Y", null=True, blank=True, verbose_name="头像",help_text="头像") sex = models.SmallIntegerField(choices=SEX_CHOICES, default=0, verbose_name="性别",help_text="性别") classmate = models.CharField(db_column="class", max_length=5, db_index=True, verbose_name="班级",help_text="班级") description = models.TextField(blank=True, null=True, verbose_name="个性签名",help_text="个性签名") class Meta: db_table = "student" verbose_name = '学生信息表' verbose_name_plural = verbose_name def __str__(self): """定义每个数据对象的显示信息""" return self.name class Course(models.Model): name = models.CharField(db_column="course", max_length=50, unique=True, verbose_name="课程名称") lecturer = models.ForeignKey("Lecturer", db_constraint=False, related_name="course_list", on_delete=models.DO_NOTHING, verbose_name="授课老师") class Meta: db_table = "course" verbose_name = "课程信息" verbose_name_plural = verbose_name def __str__(self): return self.name class Lecturer(models.Model): name = models.CharField(max_length=50, verbose_name="姓名") class Meta: db_table = "lecturer" verbose_name = "老师信息" verbose_name_plural = verbose_name def __str__(self): return self.name class Achievement(models.Model): aid = models.BigAutoField(primary_key=True, verbose_name="ID") course = models.ForeignKey("Course", db_constraint=False, related_name="achievement_list", db_column="cid", on_delete=models.DO_NOTHING, verbose_name="课程") student = models.ForeignKey("Student", db_constraint=False, related_name="achievement_list", db_column="sid", on_delete=models.DO_NOTHING, verbose_name="学生") score = models.DecimalField(db_column="achievement", max_digits=4, decimal_places=2, verbose_name="分数") class Meta: db_table = "achievement" verbose_name = "成绩信息" verbose_name_plural = verbose_name def __str__(self): return str(self.__dict__)
数据迁移
1 2 | python manage.py makemigrations python manage.py migrate |
3 页面登录访问:http://127.0.0.1:8000/admin/
4 在admin中我们管理我们创建的数据模型。
其他示例:

from django.contrib import admin from .models import Student class StudentModelAdmin(admin.ModelAdmin): """列表页配置""" # 列表列显示的数据字段[值可以是模型的字段,也可以是模型的方法名(方法不能有参数)] list_display = ["id", "name", "classmate", "age", "sex", "sex_text", "born"] # 设置点击哪些字段可以跳转到详情页 list_display_links = ["id"] # 默认排序[值只能是模型字段,不能是模型方法] ordering = ['-age','id'] # 动作栏是否在上下方显示 actions_on_top = True # 上方控制栏是否显示,默认False表示隐藏 actions_on_bottom = True # 下方控制栏是否显示,默认False表示隐藏 # 设置过滤器的字段条件[值只能是模型字段,不能是模型方法] list_filter = ["classmate", "sex"] # 过滤器,按指定字段的不同值来进行展示 # 允许直接点击列表页进入编辑的字段[值只能是模型字段,不能是模型方法] list_editable = ["age"] # 分页显示列表页数据[单页数据量] list_per_page = 5 # 搜索框搜索字段条件[值只能是模型字段,不能是模型方法] search_fields = ["name", "classmate"] # 搜索内容 # 日期筛选功能[值只能是模型中的日期时间字段,不能是模型方法,也不能时其他格式字段] date_hierarchy = "created_time" """自定义方法字段""" def sex_text(self, obj): return "男" if obj.sex else "女" # 自定义字段列的文本描述 sex_text.short_description = "性别" sex_text.admin_order_field = "sex" @admin.display(description="出生年份", ordering="age") def born(self, obj): from datetime import datetime return datetime.now().year - obj.age admin.site.register(Student, StudentModelAdmin)

from django.db import models # Create your models here. class Student(models.Model): """学生信息""" name = models.CharField(max_length=255, verbose_name="姓名", help_text="姓名") sex = models.BooleanField(default=True, verbose_name="性别" ,help_text="性别") age = models.IntegerField(verbose_name="年龄", help_text="年龄") classmate = models.CharField(db_column="class", max_length=5, verbose_name="班级", help_text="班级编号为3个数字组成") description = models.TextField(max_length=1000, null=True, blank=True, verbose_name="个性签名", help_text="个性签名") created_time = models.DateTimeField(auto_now_add=True, null=True, blank=True, help_text="注册日期") class Meta: db_table = "tb_student" verbose_name = "学生信息" verbose_name_plural = verbose_name def __str__(self): return self.name """自定义方法字段[如果在admin.py中设置了,就不要在这边编写了]""" # def sex_text(self): # return "男" if self.sex else "女" # # # 自定义字段列的文本描述 # sex_text.short_description = "性别" # sex_text.admin_order_field = "sex" # # def born(self): # from datetime import datetime # return datetime.now().year - self.age # # # 自定义字段列的文本描述 # born.short_description = "出生年份" # born.admin_order_field = "age"
附:
一般可以借助ant design(antd)、element-plus 前端的UI框架。
如果使用admin内置运营站点,也可以在admin基础上进行站点外观美化,或者功能的扩展。一般站点美化模块: xadmin(django2.x)、simpleui(django3.0,增强版:simplepro)
以simpleui为例。(simpleUI的官方站点:https://simpleui.72wo.com/)
1 安装
1 | pip install django - simpleui |
2 settings.py,注册simpleUI,
1 2 3 4 5 | INSTALLED_APPS = [ 'simpleui' , # admin界面美化,必须写在admin上面 'django.contrib.admin' , # 内置的admin运营站点 # ... ] |
3 页面登录访问:http://127.0.0.1:8000/admin/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix