Django 自带的用户系统与 RBAC 机制
Django 自带的用户系统(django.contrib.auth
)提供了 身份验证(Authentication) 和 权限管理(Authorization),能够快速实现 用户管理、权限控制、管理员后台 等功能,同时具备 RBAC(基于角色的访问控制,Role-Based Access Control) 的基本实现。本文将详细介绍 Django 用户系统的功能、管理员账号创建、RBAC 机制及其扩展方案。
一、Django 自带用户系统的作用
Django 自带的用户系统主要用于 用户身份管理、身份验证、权限与授权、用户管理后台 以及 扩展性,使开发者能够快速实现用户相关功能,而无需从零编写。
(一)用户身份管理
Django 提供了默认的 User
模型,其中包含:
- 基本字段:
username
、password
、email
等 - 权限字段:
is_active
(是否激活)、is_staff
(是否是后台管理员)、is_superuser
(是否是超级用户) - 用户创建:
User.objects.create_user()
:创建普通用户User.objects.create_superuser()
:创建超级管理员
(二)身份验证(Authentication)
- 密码存储:Django 采用 PBKDF2、Argon2、BCrypt 等安全算法存储密码
- 登录与退出:
authenticate()
:验证用户名和密码login()
:记录用户 sessionlogout()
:清除用户 session,注销登录
- 自动处理用户 session:可通过
request.user
直接获取当前登录用户
(三)权限与授权(Permissions & Authorization)
Django 的权限管理体系包含 用户权限、组权限、对象权限。
- 用户权限:通过
is_staff
和is_superuser
控制 - 组权限:使用
Group
模型批量管理权限 - 对象权限:支持模型级权限(
add_xxx
、change_xxx
、delete_xxx
) - 权限检查:
@login_required
限制访问@permission_required("app_label.permission_name")
控制权限request.user.has_perm("app_label.permission_name")
检查权限
(四)用户管理后台
Django 自带 admin
后台(django.contrib.admin
),可快速管理 用户、权限、组,无需额外开发界面。
(五)扩展性
- 自定义用户模型:通过
AbstractUser
或AbstractBaseUser
进行扩展 - 扩展用户字段:如手机号、头像等
- 第三方认证:可集成 OAuth(Google、GitHub 登录)或 JWT(DRF Simple JWT)
二、管理员账号的创建与管理
(一)如何创建管理员账号?
Django 不会自动创建管理员账号,需要手动执行以下命令:
python manage.py createsuperuser
随后输入 用户名、邮箱、密码 创建管理员账户。
(二)如何使用管理员账号登录?
- 访问 Django Admin 后台:
http://127.0.0.1:8000/admin/
- 使用
createsuperuser
创建的账号登录。
(三)如何查看或修改管理员账号?
- 在数据库中查找超级管理员:
SELECT username, email FROM auth_user WHERE is_superuser=1;
- 修改管理员密码:
python manage.py changepassword admin
三、Django 的 RBAC(基于角色的访问控制)机制
Django 自带 RBAC 的基础实现,主要通过 用户(User)、权限(Permission)、组(Group) 进行管理。
(一)用户(User)
- 每个用户可以 独立拥有权限 或 归属于某个组(Group),继承组权限。
(二)权限(Permission)
Django 提供了 基于模型的权限,默认包括:
add_modelname
(添加权限)change_modelname
(修改权限)delete_modelname
(删除权限)view_modelname
(查看权限)
权限检查
- 代码中检查权限:
if request.user.has_perm('app_label.permission_name'): # 用户有权限
- 使用装饰器:
from django.contrib.auth.decorators import permission_required @permission_required('app_label.permission_name', raise_exception=True) def my_view(request): pass
(三)组(Group)
Group
允许批量管理权限,方便将权限分配给多个用户。例如:
from django.contrib.auth.models import Group, Permission
# 创建一个 "编辑" 组
editor_group = Group.objects.create(name='Editor')
# 获取某个权限
permission = Permission.objects.get(codename='change_article')
# 给 "编辑" 组添加权限
editor_group.permissions.add(permission)
# 将用户加入 "编辑" 组
user.groups.add(editor_group)
四、Django RBAC 机制的局限性及扩展
Django 默认的 RBAC 较为基础,存在以下局限:
- 权限是基于模型的,无法控制对象级权限(如用户只能编辑自己创建的文章)
- 没有层级角色,管理员无法管理某个组
- 没有前端 UI,只能通过 Django Admin 或代码管理
(一)扩展 Django RBAC
1. 自定义权限系统
- 继承
AbstractUser
或AbstractBaseUser
自定义用户模型 - 设计
UserRole
表,实现 用户 → 角色 → 权限 关系
2. 使用 django-guardian
实现对象级权限
django-guardian
允许用户对特定对象(如某篇文章)赋权:from guardian.shortcuts import assign_perm assign_perm('change_article', user, article) # 允许 user 修改特定文章
3. 使用 django-rules
规则引擎
- 通过函数定义权限规则:
import rules @rules.predicate def is_author(user, article): return article.author == user
五、总结
功能 | Django 默认 RBAC | 扩展方案 |
---|---|---|
用户管理 | ✅ | ✅ |
组管理 | ✅ | ✅ |
基于模型权限 | ✅ | ✅ |
对象级权限 | ❌ | django-guardian |
细粒度角色管理 | ❌ | 自定义模型 |
动态权限规则 | ❌ | django-rules |
Django 自带用户系统 提供了 用户管理、身份验证、权限控制,并包含 基础 RBAC 机制,但如果需要 更复杂的权限管理(如对象级权限、动态规则),建议使用 django-guardian、django-rules 或自定义 RBAC 方案。