Django认证系统全解析:从基础到高级实践
1. Django认证系统基础架构Django内置的认证系统提供了一套完整的用户认证和授权解决方案。这个系统由几个核心组件构成用户模型User Model存储用户凭证和核心信息认证后端Authentication Backends验证用户凭证的机制权限系统Permissions控制用户能做什么会话管理Session保持用户登录状态默认配置下Django使用django.contrib.auth.models.User作为用户模型它包含以下基本字段username用户名password密码哈希值非明文存储email电子邮箱first_name名last_name姓重要提示Django不会存储原始密码而是存储经过PBKDF2算法处理的哈希值这是行业标准的安全实践。即使数据库泄露攻击者也无法直接获取用户密码。2. 用户创建与管理2.1 创建普通用户在Django中创建用户有三种主要方式1. 使用create_user()辅助函数这是最推荐的方式它会正确处理密码哈希from django.contrib.auth.models import User user User.objects.create_user( usernamejohn, emailjohnexample.com, passwords3cr3t ) # 可以继续设置其他属性 user.first_name John user.last_name Doe user.save()2. 使用管理命令创建超级用户python manage.py createsuperuser --usernameadmin --emailadminexample.com3. 通过Django Admin界面创建访问/admin/并导航到用户部分即可可视化创建用户。2.2 密码管理最佳实践Django提供了安全的密码处理机制# 修改密码会自动处理哈希 user.set_password(new_password) user.save() # 检查密码自动对比哈希 user.check_password(password) # 返回True/False安全提示用户修改密码后所有现有会话会自动失效这是防止会话劫持的重要安全特性。3. 用户认证流程实现3.1 登录视图实现Django提供了现成的认证视图但理解底层实现很重要from django.contrib.auth import authenticate, login def user_login(request): if request.method POST: username request.POST[username] password request.POST[password] user authenticate(request, usernameusername, passwordpassword) if user is not None: login(request, user) return redirect(dashboard) else: return render(request, login.html, {error: 无效的凭证}) return render(request, login.html)关键点authenticate()验证凭证但不登录login()处理会话创建登录后用户对象可通过request.user访问3.2 登出实现登出会清空会话数据from django.contrib.auth import logout def user_logout(request): logout(request) return redirect(home)4. 访问控制与权限4.1 视图级保护1. 使用装饰器限制访问from django.contrib.auth.decorators import login_required login_required def protected_view(request): return render(request, protected.html)2. 基于类的视图保护from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic import TemplateView class ProtectedView(LoginRequiredMixin, TemplateView): template_name protected.html login_url /login/ # 可选自定义登录URL4.2 权限检查Django权限系统分为三种级别模型级权限自动创建(add/change/delete/view)对象级权限需要自定义实现自定义权限通过Meta类定义检查权限示例# 检查模型级权限 if user.has_perm(app.add_model): # 有添加权限 # 检查自定义权限 if user.has_perm(app.can_publish): # 有发布权限5. 高级主题与最佳实践5.1 自定义用户模型对于大多数项目建议从一开始就使用自定义用户模型from django.contrib.auth.models import AbstractUser class CustomUser(AbstractUser): phone_number models.CharField(max_length20) avatar models.ImageField(upload_toavatars/) class Meta: permissions [ (can_verify, Can verify other users), ]在settings.py中配置AUTH_USER_MODEL myapp.CustomUser5.2 认证后端扩展可以创建自定义认证后端支持多种登录方式from django.contrib.auth.backends import BaseBackend class EmailAuthBackend(BaseBackend): def authenticate(self, request, emailNone, passwordNone): try: user User.objects.get(emailemail) if user.check_password(password): return user except User.DoesNotExist: return None然后在settings.py中配置AUTHENTICATION_BACKENDS [ django.contrib.auth.backends.ModelBackend, myapp.backends.EmailAuthBackend, ]5.3 安全增强措施密码验证AUTH_PASSWORD_VALIDATORS [ {NAME: django.contrib.auth.password_validation.MinimumLengthValidator}, {NAME: django.contrib.auth.password_validation.CommonPasswordValidator}, ]会话安全SESSION_COOKIE_AGE 1209600 # 2周秒 SESSION_COOKIE_SECURE True # 仅HTTPS SESSION_COOKIE_HTTPONLY True # 防止XSS6. 常见问题解决方案6.1 登录后重定向问题处理next参数的完整方案from django.shortcuts import redirect from django.contrib.auth.views import LoginView class CustomLoginView(LoginView): def get_success_url(self): next_url self.request.GET.get(next) if next_url and is_safe_url(next_url, allowed_hostsself.request.get_host()): return next_url return super().get_success_url()6.2 用户激活流程实现邮件激活的典型流程from django.core.mail import send_mail from django.contrib.auth.tokens import default_token_generator from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode from django.utils.encoding import force_bytes, force_str def send_activation_email(user): token default_token_generator.make_token(user) uid urlsafe_base64_encode(force_bytes(user.pk)) activation_link f{settings.BASE_URL}/activate/{uid}/{token}/ send_mail( 激活您的账户, f请点击链接激活账户: {activation_link}, noreplyexample.com, [user.email], fail_silentlyFalse, ) def activate_user(request, uidb64, token): try: uid force_str(urlsafe_base64_decode(uidb64)) user User.objects.get(pkuid) if default_token_generator.check_token(user, token): user.is_active True user.save() return redirect(activation_success) except (TypeError, ValueError, OverflowError, User.DoesNotExist): pass return redirect(activation_failed)6.3 社交账号集成使用django-allauth的配置示例INSTALLED_APPS [ allauth, allauth.account, allauth.socialaccount, allauth.socialaccount.providers.google, ] AUTHENTICATION_BACKENDS [ django.contrib.auth.backends.ModelBackend, allauth.account.auth_backends.AuthenticationBackend, ] SOCIALACCOUNT_PROVIDERS { google: { SCOPE: [profile, email], AUTH_PARAMS: {access_type: online}, } }7. 性能优化技巧权限预加载# 不好的做法N1查询 users User.objects.all() for user in users: print(user.has_perm(some_perm)) # 好的做法批量查询 from django.contrib.auth.models import Permission users User.objects.prefetch_related(user_permissions, groups__permissions)会话存储优化SESSION_ENGINE django.contrib.sessions.backends.cached_db认证查询优化# 使用select_related减少查询 user authenticate(usernameusername, passwordpassword) if user: user User.objects.select_related(profile).get(pkuser.pk)8. 测试策略8.1 单元测试示例from django.test import TestCase from django.contrib.auth import get_user_model User get_user_model() class AuthTests(TestCase): def test_user_creation(self): user User.objects.create_user( usernametest, passwordtestpass123 ) self.assertEqual(user.username, test) self.assertTrue(user.check_password(testpass123)) def test_login_view(self): User.objects.create_user( usernametestuser, passwordtestpass123 ) response self.client.post(/login/, { username: testuser, password: testpass123 }) self.assertEqual(response.status_code, 302) self.assertTrue(_auth_user_id in self.client.session)8.2 集成测试示例from selenium.webdriver.common.by import By from django.contrib.staticfiles.testing import StaticLiveServerTestCase class LoginTests(StaticLiveServerTestCase): classmethod def setUpClass(cls): super().setUpClass() cls.selenium WebDriver() cls.user User.objects.create_user( usernametestuser, passwordtestpass123 ) def test_login(self): self.selenium.get(f{self.live_server_url}/login/) username_input self.selenium.find_element(By.NAME, username) username_input.send_keys(testuser) password_input self.selenium.find_element(By.NAME, password) password_input.send_keys(testpass123) self.selenium.find_element(By.CSS_SELECTOR, button[typesubmit]).click() self.assertIn(Dashboard, self.selenium.title) classmethod def tearDownClass(cls): cls.selenium.quit() super().tearDownClass()9. 生产环境部署注意事项HTTPS强制SECURE_SSL_REDIRECT True SESSION_COOKIE_SECURE True CSRF_COOKIE_SECURE True密码哈希升级PASSWORD_HASHERS [ django.contrib.auth.hashers.Argon2PasswordHasher, django.contrib.auth.hashers.PBKDF2PasswordHasher, django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher, ]登录尝试限制 使用django-axes或类似包防止暴力破解INSTALLED_APPS [axes] AUTHENTICATION_BACKENDS [ axes.backends.AxesBackend, django.contrib.auth.backends.ModelBackend, ]10. 监控与日志配置专门的认证日志LOGGING { version: 1, loggers: { auth: { handlers: [auth_file], level: INFO, }, }, handlers: { auth_file: { class: logging.FileHandler, filename: auth.log, }, }, }然后在视图中记录关键事件import logging auth_logger logging.getLogger(auth) def login_view(request): # ... if user: auth_logger.info(fUser {user.username} logged in from {request.META[REMOTE_ADDR]}) else: auth_logger.warning(fFailed login attempt for {username} from {request.META[REMOTE_ADDR]}) # ...通过以上全面的实现方案您可以构建一个安全、灵活且易于维护的Django认证系统。根据项目需求可以进一步扩展或简化某些部分但核心架构应保持稳定。

相关新闻

AM62L SoC硬件防火墙配置详解:从寄存器解析到实战安全隔离

AM62L SoC硬件防火墙配置详解:从寄存器解析到实战安全隔离

1. 硬件防火墙在AM62L SoC中的核心地位与设计哲学在嵌入式系统,尤其是像AM62L这样的高性能异构多核SoC中,硬件防火墙(Hardware Firewall)远不止是一个简单的“看门人”。它更像是嵌入在芯片内部、由硬件逻辑实现的精密“交通管制系…

2026/7/29 7:56:55 阅读更多 →
【YOLO26多模态涨点改进】独家创新首发 | TGRS 2025 | 引入CGSAFusion跨模态门控注意力融合模块,通过自注意力机制 和 门控融合提升多模态信息融合,助力红外与可见光检测高效涨点

【YOLO26多模态涨点改进】独家创新首发 | TGRS 2025 | 引入CGSAFusion跨模态门控注意力融合模块,通过自注意力机制 和 门控融合提升多模态信息融合,助力红外与可见光检测高效涨点

一、本文介绍 🔥本文给大家介绍使用 CGSA(Cross-Domain Gated Self-Attention)跨模态门控注意力融合模块 改进 YOLO26 多模态目标检测 模型,可以通过自注意力机制和门控融合动态增强可见光与红外图像之间的特征交互,显著提升小目标检测能力。CGSA 通过频域信息和时域差异…

2026/7/28 3:03:55 阅读更多 →
Android应用按钮自动隐藏功能实现与优化

Android应用按钮自动隐藏功能实现与优化

1. 项目背景与核心需求在Android应用开发中,屏幕空间始终是宝贵资源。特别是在视频播放、阅读、游戏等沉浸式场景下,用户希望最大化利用屏幕显示内容区域。传统固定显示的按钮会占用屏幕空间,影响用户体验。这就是为什么"按钮自动隐藏&q…

2026/7/28 0:59:43 阅读更多 →

最新新闻

GPT 算不对的平面几何题,13B 小模型为什么能解?——AAAI-25 GNS 论文精读

GPT 算不对的平面几何题,13B 小模型为什么能解?——AAAI-25 GNS 论文精读

01 用13B小模型击败GPT-4o:平面几何这道「送分题」为何难倒一众AI GPT-4o 答错了。Gemini-1.5-Flash 也答错了。 题目很简单:三角形 ABC 被 DE 垂直平分,三角形 ABC 的面积是 8.0,求三角形 ADE 的面积。 GPT-4o 写了一段看起来…

2026/7/30 8:31:31 阅读更多 →
conda 环境迁移到 UV 环境

conda 环境迁移到 UV 环境

**Miniconda 迁移到 uv** 的完整流程,特别针对 **Isaac Lab/Isaac Sim** 环境进行了优化。以下是整理后的标准化操作指南:---# 🚀 Miniconda 到 uv 环境迁移指南 (Isaac Lab 专用)## 第一阶段:备份与准备 (Conda 环境)在旧环境中导…

2026/7/30 8:31:30 阅读更多 →
在本地部署Qwen大语言模型全过程总结

在本地部署Qwen大语言模型全过程总结

在本地部署Qwen大语言模型全过程总结 引言随着大语言模型(LLM)的普及,越来越多的开发者和研究者希望在本地环境中部署自己的模型,以保护数据隐私、降低API调用成本,并实现灵活的定制化应用。Qwen(通义千问…

2026/7/30 8:31:30 阅读更多 →
Masscan与Nmap组合扫描:网络安全评估中的高效端口探测与深度识别实践

Masscan与Nmap组合扫描:网络安全评估中的高效端口探测与深度识别实践

1. 项目概述:为什么需要“组合拳”? 在网络安全评估和渗透测试的初始阶段,端口扫描是获取目标网络第一手情报的基石。很多刚入行的朋友可能会觉得,端口扫描嘛,不就是找个工具扫一下,看看哪些端口开着就行了…

2026/7/30 8:31:30 阅读更多 →
第16章_HarmonyOs开发图解之 音频

第16章_HarmonyOs开发图解之 音频

第16章 HarmonyOs开发图解之 音频HarmonyOS 学习系统 | 阶段三:高级深耕期学习目标序号能力1理解音频采样的基本原理(采样率、位深度、声道)2掌握 AudioRenderer(音频播放)和 AudioCapturer(音频采集&#…

2026/7/30 8:31:30 阅读更多 →
免费开源!支持 Markdown 和 HTML 的最佳记事本 Hubble.md 来袭

免费开源!支持 Markdown 和 HTML 的最佳记事本 Hubble.md 来袭

【导语:Hubble.md 是一款免费开源的记事本,支持 Markdown 和 HTML,为用户和助手提供了便捷的笔记记录方式。它具有丰富的功能和良好的用户体验,在笔记应用领域具有一定的竞争力。】免费开源的多功能记事本Hubble.md 是一款免费且开…

2026/7/30 8:30:30 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻