Django REST Framework默认BasicAuthentication配置未生效问题
问题核心原因
你混淆了DRF中**认证(Authentication)和权限(Permission)**的作用:
- 认证类只负责校验请求携带的身份凭证是否有效,确定当前请求的用户身份,本身不会阻止未认证用户访问
- 权限类才会根据用户身份判断是否允许访问接口,DRF默认的全局权限类是
rest_framework.permissions.AllowAny,也就是允许所有用户无论是否认证都能访问,这就是你配置了认证依旧不需要登录就能访问的核心原因。
修复方案
你需要在settings.py的REST_FRAMEWORK配置中添加全局权限类配置,示例如下:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.BasicAuthentication', # 若需要支持DRF自带网页界面的登录功能,可额外补充SessionAuthentication 'rest_framework.authentication.SessionAuthentication', ], # 新增全局权限配置,要求所有接口必须登录才能访问 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ] }
如果仅需要部分接口要求登录,可以不在全局配置权限类,单独在对应视图上指定权限类即可:
from rest_framework.permissions import IsAuthenticated class StudentView(generics.ListCreateAPIView): queryset = Student.objects.all() serializer_class = StudentSerializer # 单独指定当前视图的权限要求即可,你之前单独加认证类不生效的原因也是没有配置对应权限限制 permission_classes = [IsAuthenticated]
异常排查项
如果配置后依旧不生效,可优先检查两点:
- 确认
settings.py中没有重复定义REST_FRAMEWORK配置,后定义的配置会覆盖之前的内容 - 清除浏览器缓存,或用接口测试工具不带认证信息请求接口,确认是否返回401/403状态码
内容的提问来源于stack exchange,提问作者user5626375
相关产品推荐
相关产品推荐

