如何配置Django REST Framework使GET方法必须完成身份认证才可访问
解决方案
按以下步骤排查配置即可实现需求:
- 确认权限类导入正确
确保views.py头部存在正确导入语句,避免导入其他包同名的权限类:
from rest_framework.permissions import IsAuthenticated
- 校验全局权限配置
DRF默认的全局权限为AllowAny,但类中配置的permission_classes优先级高于全局配置,可补充全局默认权限配置避免其他视图出现同类问题:
# settings.py REST_FRAMEWORK 配置项中添加 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ]
- 修正Swagger安全配置
你当前遇到的权限不生效问题大概率是Swagger未正确配置安全认证规则,导致点击Authorize后认证信息没有带入接口请求中,根据你使用的Swagger库对应配置即可:
- 若使用
drf-yasg:
# settings.py 新增配置 SWAGGER_SETTINGS = { 'USE_SESSION_AUTH': True, 'SECURITY_DEFINITIONS': { 'Basic': { 'type': 'basic' }, 'Session': { 'type': 'apiKey', 'in': 'cookie', 'name': 'sessionid' } } }
- 若使用
drf-spectacular:
# settings.py SPECTACULAR_SETTINGS 配置项中添加 'SECURITY': [ {'basicAuth': []}, {'sessionAuth': []}, ], 'SECURITY_SCHEMES': { 'basicAuth': { 'type': 'http', 'scheme': 'basic', }, 'sessionAuth': { 'type': 'http', 'scheme': 'session', } },
- (可选)方法级权限配置
如果类级别的权限配置仍不生效,可直接给指定请求方法加权限装饰器:
from rest_framework.decorators import permission_classes class ExampleList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView): queryset = ExampleModel.objects.all() serializer_class = ExampleSerializer @permission_classes([IsAuthenticated]) def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs)
配置完成后清除浏览器缓存,在Swagger的Authorize选项完成认证后再请求接口即可,未认证用户请求会返回403状态码。
内容的提问来源于stack exchange,提问作者Mario Mateaș
相关产品推荐
相关产品推荐

