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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 02:54:05