Django Rest Framework 权限冲突

2 投票
1 回答
2672 浏览
提问于 2025-04-18 12:02

我在理解Django Rest Framework的认证和权限流程时遇到了一些问题。我的REST_FRAMEWORK字典在settings.py文件中是这样的:

# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
],

'DEFAULT_AUTHENTICATION_CLASSES': (
#     # 'rest_framework.authentication.BasicAuthentication',
#     # 'rest_framework.authentication.SessionAuthentication',
    'rest_framework.authentication.TokenAuthentication',
),

现在我想让只有经过认证的用户才能调用users-listusers-detail,但是我希望未认证的用户也能调用users-create。我尝试使用rest_condition来实现:

from rest_condition import Or, And, Not
class UserViewSet(ListOnlyIfAdminMixin, viewsets.ModelViewSet):
    queryset = U.objects.all()
    serializer_class = UserSerializer
    # Would this permission_classes declaration come before or be overridden by
    #   the decorator below?
    # permission_classes = [IsAuthenticated, IsAdminOrTargetUser,]

    @permission_classes([Or(Not(IsAuthenticated), IsAdminUser)])
    def create(self, request, *args, **kwargs):
         # stuff

但是当我尝试向/api/users发送POST请求,提供正确的信息来创建一个新用户时,我收到了以下回复:

{
detail: "Authentication credentials were not provided."
}

显然,认证凭据无法提供,因为用户还没有账户或令牌。那么,有什么办法可以让用户在没有凭据的情况下注册呢?

1 个回答

1

这里 你可以看到为某个方法设置权限的顺序。

所以你可以看到,你在为 create 函数设置权限的方向是对的。不过,我不明白你为什么需要为你的权限设置一个 rest_condition:简单的 Not(IsAuthenticated) 就可以覆盖默认设置了。

撰写回答