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

server/2025/3/15 15:18:47/

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 不会自动创建管理员账号,需要手动执行以下命令:

python manage.py createsuperuser

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

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

  1. 访问 Django Admin 后台
    http://127.0.0.1:8000/admin/
    
  2. 使用 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(查看权限)
权限检查
  1. 代码中检查权限
    if request.user.has_perm('app_label.permission_name'):# 用户有权限
    
  2. 使用装饰器
    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. 自定义权限系统
  • 继承 AbstractUserAbstractBaseUser 自定义用户模型
  • 设计 UserRole 表,实现 用户 → 角色 → 权限 关系
djangoguardian__135">2. 使用 django-guardian 实现对象级权限
  • django-guardian 允许用户对特定对象(如某篇文章)赋权:
    from guardian.shortcuts import assign_permassign_perm('change_article', user, article)  # 允许 user 修改特定文章
    
djangorules__143">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 方案


http://www.ppmy.cn/server/175188.html

相关文章

AVL树的平衡算法的简化问题

AVL树是一种紧凑的二叉查找树。它的每个结点,都有左右子树高度相等,或者只相差1这样的特性。文章https://blog.csdn.net/aaasssdddd96/article/details/106291144给出了一个例子。 为了便于讨论,这里对AVL树的结点平衡情况定义2个名称&#…

【新人系列】Golang 入门(四):集合类型 - 上

✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12898955.html 📣 专栏定位:为 0 基础刚入门 Golang 的小伙伴提供详细的讲解,也欢迎大佬们…

2025 比较靠谱的上位机软件开发公司有哪些

上位机作为连接硬件设备与用户操作的核心载体,开发上位机软件则需兼顾高效性、稳定性、可扩展性及行业适配性。从技术能力、服务保障到行业经验,不同企业在细分领域展现出独特优势。带大家了解下2025年比较靠谱且有核心竞争力的上位机软件开发公司有哪些…

Gemini 2.0 Flash 原生图像生成

Google Gemini 2.0 Flash 全新开放原生图像生成功能,为开发者带来了多模态输入、增强推理能力和自然语言理解的全新体验。 多模态输入支持 支持文字与图片的联合输入(如:上传产品图输入「将背景换成雪山场景」)实现精准的语义理…

谷歌Gemini 2.0 Flash重磅更新:图文融合,初现AGI曙光

Gemini再进化,多模态能力惊艳 谷歌Gemini模型一直以其强大的多模态能力著称。它是一个“水桶型”模型,各项能力均衡,尤其在多模态理解方面处于全球领先地位。近日,谷歌宣布在Google AI Studio和Gemini API上开放Gemini 2.0 Flash的…

微软 System Center Configuration Manager(SCCM)的组件文件

微软 System Center Configuration Manager(SCCM) 或 Microsoft Endpoint Configuration Manager(MECM) 的组件文件,属于企业级设备管理工具的一部分。以下是具体说明: C:\Windows\CCM\smsswd.exe C:\Windows\CCM\tsmanager.exe smsswd.exe 和 tsmanager.exe 是 Micros…

Python网络爬虫之BeautifulSoup库的使用流程和方法

在使用BeautifulSoup解析HTML或XML数据时,需要掌握其基本使用流程和常见方法。本节将详细介绍如何使用BeautifulSoup解析网页,包括加载HTML数据、查找元素、提取文本、获取属性以及遍历HTML结构,帮助读者掌握网页数据解析的核心技能。 1. 使用BeautifulSoup解析HTML数据 在…

编程自学指南:java程序设计开发,数组与集合,为什么需要数组和集合?数组的声明与初始化, 数组遍历,多维数组

编程自学指南:java程序设计开发,数组与集合 学习目标: 掌握数组的声明、初始化和遍历 理解集合框架(List、Set、Map)的核心区别与应用场景 能够使用集合解决实际数据存储与操作问题 避免数组越界和集合操作中的常见…