news 2026/9/3 1:57:28

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/9/2 23:17:05

Windows用户如何避免常见部署问题?权威解答来了

Windows用户如何避免常见部署问题&#xff1f;权威解答来了 背景与挑战&#xff1a;从Linux到Windows的迁移痛点 随着AI生成技术的普及&#xff0c;越来越多开发者希望在本地Windows系统上运行如Image-to-Video图像转视频生成器这类基于深度学习的应用。然而&#xff0c;尽管原…

作者头像 李华
网站建设 2026/9/2 20:15:40

营销团队如何3天上线动态海报系统?

营销团队如何3天上线动态海报系统&#xff1f; 从静态到动态&#xff1a;营销内容的效率革命 在数字营销竞争日益激烈的今天&#xff0c;视觉冲击力和内容更新速度直接决定用户点击率与转化效果。传统海报设计流程依赖设计师手动制作、反复修改&#xff0c;周期长、成本高。而…

作者头像 李华
网站建设 2026/9/2 20:17:28

导师严选2026 AI论文写作软件TOP9:继续教育必备测评

导师严选2026 AI论文写作软件TOP9&#xff1a;继续教育必备测评 2026年AI论文写作软件测评&#xff1a;为何值得一看 随着人工智能技术在学术领域的不断渗透&#xff0c;AI论文写作工具已成为科研人员和继续教育学员不可或缺的辅助工具。然而&#xff0c;市场上产品繁多&#x…

作者头像 李华
网站建设 2026/9/2 20:17:29

开发者必看:如何在Windows环境部署Image-to-Video模型

开发者必看&#xff1a;如何在Windows环境部署Image-to-Video模型 &#x1f680; 背景与目标&#xff1a;为何需要本地化部署I2VGen-XL&#xff1f; 随着AIGC技术的爆发式发展&#xff0c;图像到视频&#xff08;Image-to-Video, I2V&#xff09;生成已成为内容创作、影视预演…

作者头像 李华
网站建设 2026/9/2 20:17:30

Kimi同源技术栈?这些开源模型值得关注

Kimi同源技术栈&#xff1f;这些开源模型值得关注 Image-to-Video图像转视频生成器 二次构建开发by科哥 在AIGC&#xff08;人工智能生成内容&#xff09;领域&#xff0c;图像到视频&#xff08;Image-to-Video, I2V&#xff09;生成正成为极具潜力的技术方向。近期&#xff0…

作者头像 李华
网站建设 2026/9/2 10:18:18

JVM 堆内存分代

今天我们一起来聊一聊 JVM 堆内存。 Java Heap&#xff08;堆内存&#xff09;由 Young Generation&#xff08;新生代&#xff0c;约占 1/3 &#xff09;和 Old Generation&#xff08;老年代&#xff0c;约占 2/3 &#xff09;组成。 Young Generation 又由 Eden Space&…

作者头像 李华