Django Rest Framework 权限冲突
我在理解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-list
或users-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) 就可以覆盖默认设置了。