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

Django REST Framework权限问题:创建物品时提示认证凭证未提供

问题解决:POST请求认证凭证未提供错误

问题描述

开发个人项目时,配置用户权限要求:用户注册创建物品后,仅本人可修改/删除自己的物品。但配置自定义权限后,登录用户调用POST接口创建物品时出现错误Authentication credentials were not provided.,GET接口可正常工作。

原因分析

  1. 自定义权限类拼写错误:原代码中权限类名为IsOnwerOrReadOnly(Onwer拼写错误,应为Owner),导致权限逻辑无法正确触发。
  2. 认证类未配置:项目settings.py中未指定DRF的默认认证类,导致登录用户的身份无法被正确识别。
  3. 模型查询语法错误:代码中多次出现CreateItem.object.all(),正确写法应为CreateItem.objects.all()(复数objects)。
  4. 路由格式问题:带pk的路由未以斜杠结尾,可能导致请求路由匹配异常。
  5. 自定义权限类缺失has_permission方法:POST请求创建对象时,尚未生成目标对象,has_object_permission不会被调用,需通过has_permission确保认证用户才能创建物品。

修复步骤

  1. 修正权限类拼写:将权限类名改为IsOwnerOrReadOnly,同步修改视图中的导入语句。

  2. 配置DRF认证类:在项目settings.py中添加认证配置,示例如下:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ],
}
  1. 修正模型查询语法:将所有CreateItem.object改为CreateItem.objects。

  2. 完善自定义权限类:添加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
  1. 修正路由格式:调整带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'),
]
  1. 优化视图逻辑:简化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)
  1. 检查请求凭证:确保POST请求正确携带认证信息,如使用Token认证时,请求头需包含Authorization: Token <你的令牌值>;使用Session认证时需确保请求携带正确的Session Cookie。

验证要点

  • 登录用户调用POST接口创建物品,应返回201状态码,且物品的owner字段正确关联当前用户。
  • 非物品所有者调用PATCH/DELETE接口,应返回403权限拒绝错误。
  • 未登录用户调用POST/PATCH/DELETE接口,应返回401未认证错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:13:11