1
我在理解Django Rest Framework身份验证和权限流时遇到了一些问题。我REST_FRAMEWORK
字典中settings.py
如下:Django Rest Framework权限冲突
# 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
但是当我尝试做一个POST
请求/api/users
正确的信息来创建一个新用户,我回来了以下内容:
{
detail: "Authentication credentials were not provided."
}
现在,显然不能提供认证凭证,因为用户还没有帐户或令牌。在不需要凭证的情况下让用户注册的方式是什么?
重读文档,听起来就像方法级别的权限只能比视图级别的权限**更严格**,这是我认为我正在努力的。这听起来是对的吗? – jdotjdot
是的,这似乎是正确的。所以正确的做法可能是根据您的需要为每种方法设置权限。 – AdelaN
或者您可以为您的视图使用自定义权限类:如果请求方法是POST(映射到创建)允许任何用户;否则,仅允许拥有该帐户或管理员的经过身份验证的用户。 [链接](http://www.django-rest-framework.org/api-guide/permissions#custom-permissions) – AdelaN