django - 权限类装饰器被忽略。 "Authentication credentials were not provided"响应

标签 django django-rest-framework permissions

我正在为我的 API 服务使用 Django Rest Framework。在我的 settings.py 中,我有以下 REST_FRAMEWORK 设置:

REST_FRAMEWORK = {
    ...
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated'
    )
    ...
}
现在我想更改权限类以允许任何人使用一个 View 。我使用过@permission_classes 装饰器。
class UserViewSet(viewsets.ModelViewSet):

    serializer_class = RegisterSerializer
    queryset = User.objects.all()

    @permission_classes([permissions.AllowAny,])
    def create(self, request, *args, **kwargs):
        data = request.data
        ...
我应该能够在没有任何权限的情况下执行创建操作。相反,我在尝试访问 API 时收到身份验证错误。
    "detail": "Authentication credentials were not provided."
根据docs @permission_classes 装饰器是这种权限覆盖的正确方法。这是 Django 2.2.4 和 DRF 3.10.2。
编辑
我忘了提到我不想让任何人访问任何 View ,只允许选择的 View 。大多数 View 应该具有全局设置的 IsAuthenticated 权限。

最佳答案

可以使用 DEFAULT_PERMISSION_CLASSES 设置全局设置默认权限策略。例如。

REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.IsAuthenticated',
]}

如果未指定,则此设置默认为允许不受限制的访问:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.AllowAny',
]}

如需进一步引用,您可以查看 DRF 文档 doc

编辑:

您可以使用自己的类覆盖权限:
from rest_framework import permissions

class SkipAuth(permissions.IsAuthenticated):
    def has_permission(self, request, view):
    return True

并使用此类跳过特定功能的身份验证:
@permission_classes([SkipAuth])
def create(self, request, *args, **kwargs):
   data = request.data
   ...

关于django - 权限类装饰器被忽略。 "Authentication credentials were not provided"响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57551045/

相关文章:

python - 将值插入数据库需要太长时间

permissions - GDB 权限

mysql - 具有授予选项的用户无法授予创建用户

django-rest-framework 按日期过滤器=无

azure - 需要允许我的 VSTS 服务连接向 azure 广告应用程序添加回复 URL

Django OneToOneField 错误

django - 在 Django View 中手动更新模型的 FileField

python - 在 Django View 中浏览本地目录和文件

Django rest 框架发送带单引号的字符串而不是带双引号的 JSON

Django rest framework - 在 POST 后将新创建的对象的 id 传回响应