Django REST Framework ModelViewSet如何限制用户仅操作自身账户
完整实现步骤
第一步:先解决「Authentication credentials were not provided」报错
这个报错的核心原因是DRF没有配置Token认证的解析规则,你需要先完成基础认证配置:
- 先确认
settings.py的INSTALLED_APPS中已经添加了Token应用:
INSTALLED_APPS = [ # ... 其他原有应用 'rest_framework', 'rest_framework.authtoken', # 必须添加,否则Token功能无法正常使用 ]
添加后执行python manage.py migrate生成Token存储表。
- 配置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
相关产品推荐
相关产品推荐

