Django REST Framework权限问题:创建物品时提示认证凭证未提供
问题解决:POST请求认证凭证未提供错误
问题描述
开发个人项目时,配置用户权限要求:用户注册创建物品后,仅本人可修改/删除自己的物品。但配置自定义权限后,登录用户调用POST接口创建物品时出现错误Authentication credentials were not provided.,GET接口可正常工作。
原因分析
- 自定义权限类拼写错误:原代码中权限类名为
IsOnwerOrReadOnly(Onwer拼写错误,应为Owner),导致权限逻辑无法正确触发。 - 认证类未配置:项目
settings.py中未指定DRF的默认认证类,导致登录用户的身份无法被正确识别。 - 模型查询语法错误:代码中多次出现
CreateItem.object.all(),正确写法应为CreateItem.objects.all()(复数objects)。 - 路由格式问题:带
pk的路由未以斜杠结尾,可能导致请求路由匹配异常。 - 自定义权限类缺失
has_permission方法:POST请求创建对象时,尚未生成目标对象,has_object_permission不会被调用,需通过has_permission确保认证用户才能创建物品。
修复步骤
修正权限类拼写:将权限类名改为
IsOwnerOrReadOnly,同步修改视图中的导入语句。配置DRF认证类:在项目
settings.py中添加认证配置,示例如下:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', ], }
修正模型查询语法:将所有
CreateItem.object改为CreateItem.objects。完善自定义权限类:添加
has_permission方法,确保认证用户才能执行非安全方法(POST/PUT/PATCH/DELETE):
from rest_framework import permissions class IsOwnerOrReadOnly(permissions.BasePermission): def has_permission(self, request, view): # 安全方法(GET/HEAD/OPTIONS)允许所有用户访问 if request.method in permissions.SAFE_METHODS: return True # 非安全方法仅允许认证用户 return request.user.is_authenticated def has_object_permission(self, request, view, obj): if request.method in permissions.SAFE_METHODS: return True # 修改/删除操作仅允许物品所有者 return obj.owner == request.user
- 修正路由格式:调整带
pk的路由,添加结尾斜杠,并区分列表和详情路由名称:
from .views import CreateItemView from django.urls import path urlpatterns = [ path('item-create/', CreateItemView.as_view(), name='item-create'), path('item-create/<int:pk>/', CreateItemView.as_view(), name='item-detail'), ]
- 优化视图逻辑:简化GET方法的查询逻辑,避免通过索引取值的低效写法:
def get(self, request, pk=None, format=None): if pk is not None: item = get_object_or_404(CreateItem, id=pk) serializer = CreateItemSerializer(item) return Response(serializer.data, status=status.HTTP_200_OK) # 无pk时返回所有物品列表 items = CreateItem.objects.all() serializer = CreateItemSerializer(items, many=True) return Response(serializer.data, status=status.HTTP_200_OK)
- 检查请求凭证:确保POST请求正确携带认证信息,如使用Token认证时,请求头需包含
Authorization: Token <你的令牌值>;使用Session认证时需确保请求携带正确的Session Cookie。
验证要点
- 登录用户调用POST接口创建物品,应返回201状态码,且物品的
owner字段正确关联当前用户。 - 非物品所有者调用PATCH/DELETE接口,应返回403权限拒绝错误。
- 未登录用户调用POST/PATCH/DELETE接口,应返回401未认证错误。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

