DjangoToken认证详解与HTTP401、403状态码的区别
作者:逸之思 | 来源:互联网 | 2024-12-20 15:43
本文详细介绍了如何在Django中配置和使用Token认证,并解释了HTTP401和HTTP403状态码的区别。通过具体的代码示例,帮助开发者理解认证机制及权限控制。
### Django Token 认证环境搭建 首先,确保安装了必要的模块。使用以下命令安装 `djangorestframework`: ```bash pip install djangorestframework ``` 接下来,在项目的 `settings.py` 文件中进行相关配置。添加如下内容以启用 REST 框架和 Token 认证: ```python INSTALLED_APPS = [ ... 'rest_framework', 'rest_framework.authtoken', ] REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.AllowAny', # 允许所有用户访问 ], 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', # 启用 Token 认证 ] } ``` #### 同步数据库生成 Token 表 运行以下命令同步数据库并创建 `authtoken_token` 表: ```bash python manage.py migrate ``` ### 编写登录视图函数 为了实现用户登录并生成 Token,可以编写一个视图类。以下是具体代码示例: ```python from django.contrib.auth import authenticate, login from rest_framework.authtoken.models import Token from rest_framework.permissions import AllowAny from rest_framework.response import Response from rest_framework.views import APIView class LoginViewSet(APIView): permission_classes = (AllowAny,) # 登录接口允许所有人访问 def post(self, request, *args, **kwargs): username = request.data.get('username') password = request.data.get('password') user = authenticate(username=username, password=password) if not user: return Response({'code': 1, 'msg': '用户名或密码错误'}) else: # 删除旧的 Token old_token = Token.objects.filter(user=user) old_token.delete() # 创建新的 Token token = Token.objects.create(user=user) return Response({'code': 0, 'msg': '登录成功!', 'username': user.username, 'token': token.key}) ``` ### 配置 URL 访问路径 在 `urls.py` 中添加相应的 URL 路由配置: ```python from django.urls import path from .views import LoginViewSet urlpatterns = [ path('login/', LoginViewSet.as_view(), name='login'), ] ``` ### Token 认证接口示例 对于需要 Token 认证的接口,可以在视图类中指定认证方式和权限类。例如: ```python from rest_framework.authentication import TokenAuthentication from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView class CardListAPIView(APIView): authentication_classes = (TokenAuthentication,) # 使用 Token 进行认证 permission_classes = (IsAuthenticated,) # 只有已认证用户才能访问 def get(self, request, format=None): cards = Card.objects.all() serializer = CardAPISerializer(cards, many=True) return Response({'code': 0, 'msg': 'success!', 'data': serializer.data}) def post(self, request, format=None): verify_data = CardAPISerializer(data=request.data) if verify_data.is_valid(): verify_data.save() return Response({'code': 0, 'msg': 'success!', 'data': request.data}) ``` ### 接口访问示例 当用户尝试访问受保护的接口时,必须提供有效的 Token。如果缺少 Token 或 Token 无效,则会返回 HTTP 401 Unauthorized 错误;如果用户没有足够的权限,则会返回 HTTP 403 Forbidden 错误。 #### HTTP 401 和 403 的区别 - **HTTP 401 Unauthorized**:表示请求未经过身份验证或提供的凭据无效。通常是因为用户未登录或 Token 无效。 - **HTTP 403 Forbidden**:表示请求已经过身份验证,但用户没有执行该操作的权限。例如,普通用户试图访问仅限管理员的操作。 总结来说,401 表示认证失败,而 403 表示权限不足。理解这两者的区别有助于更好地设计和调试安全的 API 接口。
推荐阅读
本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ...
[详细]
蜡笔小新 2024-12-27 20:40:29
本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ...
[详细]
蜡笔小新 2024-12-27 16:07:12
本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ...
[详细]
蜡笔小新 2024-12-26 17:37:25
蜡笔小新 2024-12-26 13:29:32
本文介绍如何在Element UI的Select组件中使用allow-create属性创建新条目,并处理创建条目为空时出现的错误。我们将详细说明filterable属性的必要性,以及default-first-option属性的作用。 ...
[详细]
蜡笔小新 2024-12-26 12:39:46
本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ...
[详细]
蜡笔小新 2024-12-26 08:25:19
使用GDI的一些AIP函数我们可以轻易的绘制出简 ...
[详细]
蜡笔小新 2024-12-25 18:23:37
本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ...
[详细]
蜡笔小新 2024-12-25 16:00:21
本文探讨了在 Vue 2.0 项目中使用 Axios 获取数据时可能出现的错误,并提供详细的解决方案和最佳实践。 ...
[详细]
蜡笔小新 2024-12-25 14:02:12
网络拓扑如下:组网情况:企业用户主要有技术部(VLAN10)和行政部(VLAN20),通过汇聚交换机连接到USG。企业分别通过两个不同运营商(ISP1和ISP2)连接到 ...
[详细]
蜡笔小新 2024-12-24 14:57:16
本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ...
[详细]
蜡笔小新 2024-12-22 16:20:33
本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ...
[详细]
蜡笔小新 2024-12-22 15:33:55
本文介绍如何在PHPCMS V9中创建和管理多个站点,包括配置独立域名、设置动态URL,并确保各子站能够正常运行。我们将详细讲解从新建站点到最终配置路由的每一步骤。 ...
[详细]
蜡笔小新 2024-12-27 05:15:58
本文详细探讨了Netty中Future及其子类的设计与实现,包括其在并发编程中的作用和具体应用场景。我们将介绍Future的继承体系、关键方法的实现细节,并讨论如何通过监听器和回调机制来处理异步任务的结果。 ...
[详细]
蜡笔小新 2024-12-26 20:12:47
本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ...
[详细]
蜡笔小新 2024-12-25 13:17:38