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

Django 自带的用户系统与 RBAC 机制

Django 自带的用户系统(django.contrib.auth)提供了 身份验证(Authentication)权限管理(Authorization) ,能够快速实现 用户管理、权限控制、管理员后台 等功能,同时具备 RBAC(基于角色的访问控制,Role-Based Access Control) 的基本实现。本文将详细介绍 Django 用户系统的功能、管理员账号创建、RBAC 机制及其扩展方案。


一、Django 自带用户系统的作用

Django 自带的用户系统主要用于 用户身份管理、身份验证、权限与授权、用户管理后台 以及 扩展性,使开发者能够快速实现用户相关功能,而无需从零编写。

(一)用户身份管理

Django 提供了默认的 User 模型,其中包含:

  • 基本字段usernamepasswordemail
  • 权限字段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_staffis_superuser 控制
  • 组权限 :使用 Group 模型批量管理权限
  • 对象权限 :支持模型级权限(add_xxxchange_xxxdelete_xxx
  • 权限检查
    • @login_required 限制访问
    • @permission_required("app_label.permission_name") 控制权限
    • request.user.has_perm("app_label.permission_name") 检查权限

(四)用户管理后台

Django 自带 admin 后台(django.contrib.admin),可快速管理 用户、权限、组,无需额外开发界面。

(五)扩展性

  • 自定义用户模型 :通过 AbstractUserAbstractBaseUser 进行扩展
  • 扩展用户字段:如手机号、头像等
  • 第三方认证:可集成 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. 自定义权限系统
  • 继承 AbstractUserAbstractBaseUser 自定义用户模型
  • 设计 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 方案

相关推荐
元气满满的热码式34 分钟前
MySQL启动报错解决
运维·数据库·mysql
XMYX-035 分钟前
解决 Redis 后台持久化失败的问题:内存不足导致 fork 失败
java·数据库·redis
猿小喵35 分钟前
MySQL异常SQL排查
数据库·sql·mysql
椰椰椰耶40 分钟前
【redis】set 类型:基本命令
数据库·redis·缓存
奥顺互联V1 小时前
泛目录程序:无需数据库的高效站群解决方案
数据库·搜索引擎·php
17´1 小时前
Qt从入门到入土(十) -数据库操作--SQLITE
数据库·c++·qt·sqlite
多敲代码防脱发2 小时前
数据库MySQL原理(相关程序)
数据库·mysql
Future_yzx2 小时前
分布式存储学习——HBase表结构设计
数据库·oracle
java_python源码3 小时前
【2025】基于python+django的慢性病健康管理系统(源码、万字文档、图文修改、调试答疑)
数据库·python·django
千益3 小时前
【数据库】10分钟学会MySQL的增删改查:数据库、表、表记录操作指南
数据库·mysql