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

Django REST Framework ModelViewSet如何限制用户仅操作自身账户

完整实现步骤

第一步:先解决「Authentication credentials were not provided」报错

这个报错的核心原因是DRF没有配置Token认证的解析规则,你需要先完成基础认证配置:

  1. 先确认settings.py的INSTALLED_APPS中已经添加了Token应用:
INSTALLED_APPS = [
    # ... 其他原有应用
    'rest_framework',
    'rest_framework.authtoken',  # 必须添加,否则Token功能无法正常使用
]

添加后执行python manage.py migrate生成Token存储表。

  1. 配置Token认证规则,可选择全局配置或者视图局部配置:

全局配置(settings.py)

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication', # 开启Token解析
    ],
    # 全局默认要求登录,不需要可以删除
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}

视图局部配置(不需要全局生效的话可以单独加在UserViewSet中)


第二步:编写自定义权限类

在应用目录下新建permissions.py文件,编写仅允许操作自身账户的权限逻辑:

from rest_framework import permissions

class IsOwnerOfObject(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        # 仅当请求的用户对象和当前登录用户完全一致时,允许操作
        return obj == request.user

第三步:修改UserViewSet完成权限绑定

from rest_framework import viewsets
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from django.contrib.auth.models import User
from .serializers import UserSerializer
from .permissions import IsOwnerOfObject

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    
    # 如果你已经在settings做了全局配置,下面两行可以省略
    authentication_classes = [TokenAuthentication]
    # 权限顺序:先校验是否登录,再校验是否是账户所有者
    permission_classes = [IsAuthenticated, IsOwnerOfObject]

    # 可选优化:重写查询集,让用户只能看到自己的信息,避免列表接口返回所有用户数据
    def get_queryset(self):
        return User.objects.filter(id=self.request.user.id)

测试注意事项

Postman请求时需要在请求头中正确携带Token,否则依然会报凭证未提供错误:

  • 请求头键:Authorization
  • 请求头值:Token 你的用户Token字符串
    注意Token和后面的Token值之间必须有一个空格,不要写错格式。

内容的提问来源于stack exchange,提问作者Himanshu Poddar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:15:06