【后端】【django】Django 自带的用户系统与 RBAC 机制

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():记录用户 session
    • logout():清除用户 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 不会自动创建管理员账号,需要手动执行以下命令:

bash 复制代码
python manage.py createsuperuser

随后输入 用户名、邮箱、密码 创建管理员账户。

(二)如何使用管理员账号登录?

  1. 访问 Django Admin 后台 :

    复制代码
    http://127.0.0.1:8000/admin/
  2. 使用 createsuperuser 创建的账号登录。

(三)如何查看或修改管理员账号?

  • 在数据库中查找超级管理员 :

    sql 复制代码
    SELECT username, email FROM auth_user WHERE is_superuser=1;
  • 修改管理员密码 :

    bash 复制代码
    python manage.py changepassword admin

三、Django 的 RBAC(基于角色的访问控制)机制

Django 自带 RBAC 的基础实现,主要通过 用户(User)、权限(Permission)、组(Group) 进行管理。

(一)用户(User)

  • 每个用户可以 独立拥有权限 或 归属于某个组(Group),继承组权限。

(二)权限(Permission)

Django 提供了 基于模型的权限,默认包括:

  • add_modelname(添加权限)
  • change_modelname(修改权限)
  • delete_modelname(删除权限)
  • view_modelname(查看权限)
权限检查
  1. 代码中检查权限 :

    python 复制代码
    if request.user.has_perm('app_label.permission_name'):
        # 用户有权限
  2. 使用装饰器 :

    python 复制代码
    from django.contrib.auth.decorators import permission_required
    
    @permission_required('app_label.permission_name', raise_exception=True)
    def my_view(request):
        pass

(三)组(Group)

Group 允许批量管理权限,方便将权限分配给多个用户。例如:

python 复制代码
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 允许用户对特定对象(如某篇文章)赋权:

    python 复制代码
    from guardian.shortcuts import assign_perm
    
    assign_perm('change_article', user, article)  # 允许 user 修改特定文章
3. 使用 django-rules 规则引擎
  • 通过函数定义权限规则:

    python 复制代码
    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 方案。

相关推荐
AIgorithmGEEK8 小时前
MySQL 索引全解(下):建、查、删实战与知识速查表
数据库·mysql·b+树·索引
唠点键盘之外的10 小时前
26 向量数据库实战:从 0 搭一条能用的检索链路(pgvector + Spring AI)
数据库·人工智能·spring
云和恩墨10 小时前
数据库监控简史:监控不止于告警——从图表大爆发到健康管理闭环
数据库
ly768910 小时前
MongoDB 事务开销实测:快照隔离下的写冲突、重试与分片事务边界
数据库·mongodb·事务·分片集群·快照隔离·写冲突
豆角焖肉10 小时前
Spring AOP 自定义注解实现系统操作日志
数据库·自定义注解·springaop·操作日志·aop 切面
金伟API102412 小时前
不会写复杂SQL怎么办?
数据库·sql
执笔为剑12 小时前
2.1.2-1、V8R3迁移到V8R6-Oracle兼容特性
数据库
geovindu12 小时前
sql:Search-Optimized SQL Queries using mysql 9.0
android·数据库·sql·mysql·数据库开发·数据库架构
for_ever_love__13 小时前
MySQL SELECT 与 WHERE 优化实战:可搜索条件、联合索引与执行计划
数据库·mysql·oracle·select·where·条件优化·查询优化技巧
2501_9318037513 小时前
MySQL 锁机制详解
数据库·mysql