Django Rest Framework在编辑用户时返回403 Forbidden,但在未以任何用户身份登录时工作

Posted

技术标签:

【中文标题】Django Rest Framework在编辑用户时返回403 Forbidden,但在未以任何用户身份登录时工作【英文标题】:Django Rest Framework returning 403 Forbidden when editing user, but works when not logged in as any user 【发布时间】:2021-01-04 21:07:04 【问题描述】:

我正在尝试在我的用户模型上发出 PUT 请求,以使用带有 React 前端的 Django Rest 编辑用户名、简历等。

当我通过 django rest 客户端在 url 上发出 PUT 请求时,它没有问题。在前端,当我没有登录任何 django 用户时,我可以通过 AXios 发送 PUT 请求而没有问题。

一旦我登录到任何 django 用户,即使拥有超级用户权限,我的 PUT 请求也会收到 403 Forbidden Error。

这是我的views.py:

class RetrieveUpdateDestroyUser(RetrieveUpdateDestroyAPIView):

    serializer_class = UserCreateUpdateSerializer
    queryset = CustomUser.objects.all()
    lookup_field = 'id'
    permission_classes = (AllowAny,)

    def update(self, request, *args, **kwargs):
        """
        PUT and UPDATE requests handled by this method.
        """
        return super().update(request, *args, **kwargs)

在我的前端,这就是我发出 PUT 请求的方式(使用 axios 完成请求):

export class UserProxy extends BackendProxy 

    updateUser(updatedUser, userID) 
  
        let parameters = `user/$userID`
        return new Promise((resolve, reject) => 
            this.putRequest(updatedUser, parameters)
                .then(response =>  resolve(response) )
                .catch(error => 
                    console.log(error)
                    reject(error)
                )
        );
    

对于为什么我没有登录 django 用户时没有得到 403 Forbidden 感到非常困惑,但是当我登录时却得到了。如果那样的话,我也使用 Python-Social-Auth 进行登录很重要。

谢谢!

【问题讨论】:

【参考方案1】:

可能导致这种情况的一件事是,如果您使用的是 SessionAuthentication。匿名用户在身份验证过程的早期获得“身份验证”。经过身份验证的用户会通过额外的 CSRF 检查。如果失败,则会抛出 HTTP 403。

就我而言,我意识到我应该使用 GET,而 CSRF 不适用 (https://www.django-rest-framework.org/topics/ajax-csrf-cors/#csrf-protection)。

【讨论】:

非常感谢,我最终解决了它,正如你所说,这是一个 CSRF 问题。如果其他人正在寻找答案,请在我的个人资料中查看

以上是关于Django Rest Framework在编辑用户时返回403 Forbidden,但在未以任何用户身份登录时工作的主要内容,如果未能解决你的问题,请参考以下文章

在序列化程序中编辑外键字段 - Django Rest Framework

如何:创建一个视图和序列化器,用于添加,编辑和删除具有外部关系的对象django rest framework

Django Rest Framework在编辑用户时返回403 Forbidden,但在未以任何用户身份登录时工作

Django REST Framework:在列表响应中呈现表单元素

DRF:如何将 django-rest-framework-jwt 集成到 Djoser

在 Django REST Framework 中处理嵌套对象表示