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
相关产品推荐
相关产品推荐

