Django REST框架:视图允许匿名与认证用户访问却返回401问题
问题根因
你全局仅配置了TokenAuthentication作为认证类,而该认证类在请求未携带Token时,会直接抛出AuthenticationFailed异常并返回401错误,流程根本走不到AllowAny权限类的校验环节。
解决方案
提供两种可行方案,按需选择:
方案一:修改全局认证配置
在settings.py的REST_FRAMEWORK中添加SessionAuthentication(适配使用Django session认证的项目),这样当请求无Token时,Session认证会返回匿名用户,而非直接报错:
REST_FRAMEWORK = { 'DATETIME_FORMAT': "%c", 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication', # 新增该行 ], }
方案二:视图内自定义认证规则
若不想改动全局配置,可在目标视图中使用自定义的“可选Token认证类”——无Token时不抛出异常,直接返回匿名用户:
先编写自定义认证类:
from rest_framework.authentication import TokenAuthentication from rest_framework.exceptions import AuthenticationFailed class OptionalTokenAuthentication(TokenAuthentication): def authenticate(self, request): try: # 尝试Token认证 return super().authenticate(request) except AuthenticationFailed: # 无Token时返回None,让request.user变为AnonymousUser return None
再在视图中配置该认证类:
class CourseListView(generics.ListAPIView): permission_classes = [AllowAny, ] authentication_classes = [OptionalTokenAuthentication, ] # 使用自定义认证类 def list(self, request, format=None): user = request.user realUserFlag = not user.is_anonymous ...
调整后,匿名用户访问时认证流程不会报错,request.user会被设为AnonymousUser,AllowAny权限类会正常允许访问,你也能通过user.is_anonymous区分用户类型执行不同逻辑。
内容的提问来源于stack exchange,提问作者AlwaysLearning
相关产品推荐
相关产品推荐

