news 2026/6/7 7:42:07

Python核心:Django鉴权方案全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python核心:Django鉴权方案全解析

Python 核心:Django 鉴权方案全解析

Django 作为 Python 最成熟的 Web 框架,其鉴权系统(Authentication & Authorization)是核心模块之一。它提供了开箱即用的用户认证、权限控制和会话管理,同时高度可扩展。Django 的鉴权方案基于django.contrib.auth模块,遵循“电池内置”原则,但允许自定义扩展。本文从基础到高级,深入解析 Django 4.x+(2026 最新版)的鉴权方案,包括原理、实现、对比和最佳实践。

1. Django 鉴权系统概述

核心概念

  • 认证(Authentication):验证用户身份(谁是你?),如用户名/密码、Token。
  • 授权(Authorization):检查用户权限(你能做什么?),如访问特定视图、操作数据。
  • 用户模型(User Model):默认auth.User,可自定义扩展。
  • 会话管理:基于 Session 或 Token 维护状态。

工作原理

  1. 用户请求到达视图。
  2. 中间件(如AuthenticationMiddleware)从请求中提取凭证(Cookie、Header),加载用户对象到request.user
  3. 视图中使用装饰器(如@login_required)检查认证/权限。
  4. 如果未认证,重定向到登录页或返回 401/403。

默认配置(settings.py):

INSTALLED_APPS=['django.contrib.auth',# 必须启用'django.contrib.contenttypes',# 权限依赖]AUTH_USER_MODEL='auth.User'# 默认用户模型,可自定义如 'myapp.CustomUser'MIDDLEWARE=['django.contrib.sessions.middleware.SessionMiddleware',# 会话支持'django.contrib.auth.middleware.AuthenticationMiddleware',# 认证中间件]AUTHENTICATION_BACKENDS=['django.contrib.auth.backends.ModelBackend']# 默认后端
2. 内置认证方案详解

Django 提供了多种开箱即用的鉴权方案,按复杂度分类。

2.1 基于 Session 的用户名/密码认证(默认方案)
  • 原理:用户登录后,Django 生成 Session ID 存入 Cookie,服务器端存储用户状态。

  • 流程

    1. 用户提交用户名/密码。
    2. 调用authenticate(username, password)验证。
    3. 如果成功,调用login(request, user)设置 Session。
    4. 后续请求携带 Cookie,中间件加载request.user
  • 代码示例(views.py):

fromdjango.contrib.authimportauthenticate,login,logoutfromdjango.httpimportJsonResponsedeflogin_view(request):ifrequest.method=='POST':username=request.POST['username']password=request.POST['password']user=authenticate(request,username=username,password=password)ifuserisnotNone:login(request,user)returnJsonResponse({'message':'登录成功'})else:returnJsonResponse({'error':'凭证无效'},status=401)returnJsonResponse({'error':'无效请求'},status=400)deflogout_view(request):logout(request)returnJsonResponse({'message':'登出成功'})
  • 装饰器使用
fromdjango.contrib.auth.decoratorsimportlogin_required@login_required# 未登录重定向到登录页defprotected_view(request):returnJsonResponse({'user':request.user.username})
  • 优点:简单、安全(服务器端存储)。
  • 缺点:不适合分布式系统(需共享 Session),移动端不友好。
2.2 基于 Token 的认证(RESTful API 常用)
  • 原理:登录后生成 Token,返回给客户端。后续请求在 Header 中携带 Token(如 Authorization: Token xxx)。

  • 内置支持:Django REST Framework (DRF) 扩展了 Token 认证。

  • 安装 DRFpip install djangorestframework

  • 配置(settings.py):

INSTALLED_APPS=['rest_framework','rest_framework.authtoken']REST_FRAMEWORK={'DEFAULT_AUTHENTICATION_CLASSES':['rest_framework.authentication.TokenAuthentication','rest_framework.authentication.SessionAuthentication',],}
  • 代码示例(views.py):
fromrest_framework.authtoken.modelsimportTokenfromrest_framework.decoratorsimportapi_view,authentication_classes,permission_classesfromrest_framework.permissionsimportIsAuthenticatedfromrest_framework.responseimportResponse@api_view(['POST'])defapi_login(request):# ... 验证用户名/密码 ...token,created=Token.objects.get_or_create(user=user)returnResponse({'token':token.key})@api_view(['GET'])@authentication_classes([TokenAuthentication])@permission_classes([IsAuthenticated])defapi_protected(request):returnResponse({'user':request.user.username})
  • 客户端使用:Header 中Authorization: Token <key>

  • 优点:无状态、适合 API、分布式系统。

  • 缺点:Token 泄露风险大(需加密传输),无内置过期机制(需自定义)。

2.3 基于 JWT 的认证(高级 Token 方案)
  • 原理:JSON Web Token(JWT)是自包含的 Token,包含用户数据、签名和过期时间。无需服务器存储。

  • 第三方库:推荐djangorestframework-simplejwt(pip install)

  • 配置(settings.py):

REST_FRAMEWORK={'DEFAULT_AUTHENTICATION_CLASSES':['rest_framework_simplejwt.authentication.JWTAuthentication',],}SIMPLE_JWT={'ACCESS_TOKEN_LIFETIME':timedelta(minutes=5),# 访问 Token 有效期'REFRESH_TOKEN_LIFETIME':timedelta(days=1),# 刷新 Token 有效期}
  • 代码示例
fromrest_framework_simplejwt.tokensimportRefreshToken@api_view(['POST'])defjwt_login(request):# ... 验证用户名/密码 ...refresh=RefreshToken.for_user(user)returnResponse({'refresh':str(refresh),'access':str(refresh.access_token),})# 使用:Header 中 Authorization: Bearer <access_token>
  • 优点:无状态、可扩展、支持过期/刷新机制。
  • 缺点:Token 较长、无法主动失效(需黑名单)。
3. 权限控制(Authorization)

Django 的权限系统基于用户、组和权限模型。

  • 内置权限:CRUD 操作(如 ‘app.add_model’)。

  • 检查方式

    • 装饰器:@permission_required('app.change_model')
    • 代码中:user.has_perm('app.add_model')
    • 组:用户可加入组,继承组权限。
  • 自定义权限(models.py):

classMeta:permissions=[("can_publish","Can publish posts"),]
4. 自定义认证后端

默认后端是用户名/密码,可扩展支持邮箱、第三方登录等。

  • 自定义后端(backends.py):
fromdjango.contrib.auth.backendsimportModelBackendfromdjango.contrib.authimportget_user_modelclassEmailBackend(ModelBackend):defauthenticate(self,request,username=None,password=None,**kwargs):UserModel=get_user_model()try:user=UserModel.objects.get(email=username)ifuser.check_password(password):returnuserexceptUserModel.DoesNotExist:returnNone
  • 配置
AUTHENTICATION_BACKENDS=['path.to.EmailBackend']
5. 鉴权方案对比表
方案状态性适用场景安全性复杂度扩展性
Session有状态Web 应用、浏览器端
Token (DRF)无状态REST API、移动端
JWT无状态微服务、分布式系统
OAuth2无状态第三方登录(如 Google)
6. 最佳实践与注意事项
  • 自定义用户模型:项目启动时就定义AbstractUser子类,避免迁移问题。
  • 密码存储:始终用make_passwordcheck_password,默认 PBKDF2 算法。
  • 安全配置:启用 CSRF、HTTPS,设置SECURE_COOKIE
  • 性能优化:JWT 避免存敏感数据;Session 用 Redis 缓存。
  • 第三方集成:用django-allauthdjango-oauth-toolkit支持社交登录/OAuth。
  • 常见坑:未启用中间件导致request.user为 AnonymousUser;自定义模型未设置USERNAME_FIELD

Django 的鉴权系统强大且灵活,结合 DRF 可轻松构建企业级应用。掌握这些,你就能在 Python Web 开发中游刃有余!

如果想看完整项目代码、OAuth 示例或特定版本差异,随时告诉我!🚀

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 17:55:09

SpringBoot集成DeepSeek

Spring Boot 集成 DeepSeek&#xff1a;2026 年最新完整指南 DeepSeek 是中国领先的开源大语言模型提供商&#xff08;DeepSeek-V3、DeepSeek-R1 等&#xff09;&#xff0c;其 API 完全兼容 OpenAI 格式。这意味着你可以轻松在 Spring Boot 项目中使用它&#xff0c;尤其通过…

作者头像 李华
网站建设 2026/5/30 17:55:15

利用人工智能技术轻松打造专业学术风格的开题报告PPT范例

AI工具开题报告生成能力对比速览 工具名称 生成速度 内容完整度 参考文献质量 适用场景 AIbiye ⚡⚡⚡⚡ ⭐⭐⭐⭐ 15真实文献 理工科开题 AICheck ⚡⚡⚡ ⭐⭐⭐⭐⭐ 自动匹配领域 人文社科类 秒篇 ⚡⚡⚡⚡⚡ ⭐⭐⭐ 基础文献支持 紧急需求 AskPaper ⚡…

作者头像 李华
网站建设 2026/5/30 18:49:27

预算有限的小微企业,如何用技术平权实现高性价比精准引才?

“公司品牌知名度不高&#xff0c;预算有限&#xff0c;发布一个岗位大半个月收不到几份像样的简历……”这或许是不少中小企业HR&#xff0c;特别是小微企业HR负责人的共同烦恼。在传统招聘中&#xff0c;企业常面临“招人难、招人贵、招人没效果”的三重困境。一次招聘动辄花…

作者头像 李华
网站建设 2026/5/30 13:58:18

新闻报道可视化:重大事件图片转为动态重现视频

新闻报道可视化&#xff1a;重大事件图片转为动态重现视频 引言&#xff1a;静态图像的动态重生 在新闻报道中&#xff0c;重大事件往往以一张震撼人心的照片定格历史。然而&#xff0c;静态图像虽具冲击力&#xff0c;却难以完整还原现场的动态氛围与时间流动感。随着AI生成技…

作者头像 李华
网站建设 2026/5/30 13:57:56

Spring Boot 配置文件深度解析

Spring Boot 配置文件深度解析&#xff08;2026 最新版&#xff09; Spring Boot 的配置文件是整个应用的核心“控制中心”&#xff0c;它决定了应用的端口、数据库连接、日志级别、自定义属性等几乎所有行为。Spring Boot 提供了强大而灵活的配置机制&#xff0c;支持多种格式…

作者头像 李华
网站建设 2026/5/30 13:57:16

中文语音合成技术演进:从传统TTS到Sambert-HifiGan

中文语音合成技术演进&#xff1a;从传统TTS到Sambert-HifiGan 技术背景与演进脉络 语音合成&#xff08;Text-to-Speech, TTS&#xff09;技术的目标是将文本自动转换为自然流畅的语音输出。在中文场景下&#xff0c;由于声调、语义韵律和多音字等语言特性复杂&#xff0c;高质…

作者头像 李华