如何修改DRF自定义权限类 限制未登录用户访问API数据
DRF限制未登录用户访问API的权限类修改方案
现有permissions.py中的ReadOnly类仅对请求方法做了校验,未加入用户登录状态判断,按照你的需求可按以下方案修改:
方案1:所有请求(含GET/HEAD等安全方法)仅允许登录用户访问
修改后的permissions.py代码如下:
from rest_framework import permissions from rest_framework.permissions import BasePermission, SAFE_METHODS class IsAuthenticated(permissions.BasePermission): def has_permission(self, request, view): # 仅已登录用户会返回True return request.user and request.user.is_authenticated
如果不需要自定义额外逻辑,也可以直接使用DRF内置的permissions.IsAuthenticated权限类,无需自己编写实现。
方案2:未登录用户仅可访问安全方法,写操作需要登录
如果需要保留未登录用户的只读访问权限,仅限制增删改操作需要登录,可修改为如下代码:
from rest_framework import permissions from rest_framework.permissions import BasePermission, SAFE_METHODS class IsAuthenticatedOrReadOnly(permissions.BasePermission): def has_permission(self, request, view): # 安全方法直接放行,其余操作需要校验登录状态 return request.method in SAFE_METHODS or (request.user and request.user.is_authenticated)
同样该逻辑也有DRF内置实现permissions.IsAuthenticatedOrReadOnly,可直接引用。
权限类生效配置
修改完权限类后,需要将其配置到对应接口才能生效:
- 全局生效(所有接口默认使用该权限):在项目
settings.py中添加配置
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ # 替换为你实际的权限类路径,也可直接填内置类路径'rest_framework.permissions.IsAuthenticated' '你的应用名.permissions.IsAuthenticated', ] }
- 单视图生效(仅指定接口使用该权限):在对应视图类中添加属性
from rest_framework import viewsets from 你的应用名.permissions import IsAuthenticated class 你的视图类(viewsets.ModelViewSet): permission_classes = [IsAuthenticated] # 其余视图配置省略
内容的提问来源于stack exchange,提问作者user16128694
相关产品推荐
相关产品推荐

