You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework中permission_classes与authentication_classes的区别及可浏览页登录问题

问题解答

问题诱因

你遇到的问题核心是DRF可浏览API页面的身份验证逻辑和你配置的认证类不匹配:

  • DRF自带的可浏览API页面的登录表单,默认走的是SessionAuthentication认证逻辑,你在视图的authentication_classes中只配置了TokenAuthentication,相当于只允许携带Token令牌的请求通过身份校验,页面登录时携带的Session凭证会被直接忽略,因此会返回Authentication credentials were not provided.的错误。
  • curl、httpie请求正常是因为你主动在请求头中携带了合法的Token凭证,符合你配置的TokenAuthentication校验规则。
  • 你删除视图的authentication_classes配置后,DRF会自动使用全局settings.py中配置的默认认证类,默认配置通常同时包含SessionAuthentication和TokenAuthentication,因此页面登录和Token请求都可以正常工作。

如果需要同时支持Token请求和可浏览页面登录,只需要修改视图的认证类配置即可:

class UserListView(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (permissions.IsAdminUser,)
    # 同时添加两种认证类,适配不同请求场景
    authentication_classes = [TokenAuthentication, SessionAuthentication] 

authentication_classes与permission_classes的区别

两者是DRF权限控制流程中前后衔接的两个环节,核心职责完全不同:

  • 认证(authentication_classes):负责识别用户身份,核心逻辑是校验请求中携带的身份凭证(Token、Session、账号密码等)是否合法,校验成功后会将对应的用户对象绑定到request.user上。配置的多个认证类会按顺序依次尝试校验,只要有一个校验成功就终止认证流程,全部校验失败则判定当前请求为匿名用户请求。
  • 权限(permission_classes):负责判定当前用户是否允许执行对应操作,是在认证流程结束、拿到当前请求的用户身份之后才会执行的校验。比如你配置的permissions.IsAdminUser,作用就是校验认证流程得到的request.user是否为管理员身份,是则允许访问,否则直接返回权限不足错误。

内容的提问来源于stack exchange,提问作者AaqilSh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:27:02