2014-07-03 60 views
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-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 

但是当我尝试做一个POST请求/api/users正确的信息来创建一个新用户,我回来了以下内容:

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

现在,显然不能提供认证凭证,因为用户还没有帐户或令牌。在不需要凭证的情况下让用户注册的方式是什么?

回答

1

here您可以看到为某个方法设置权限的顺序。

所以你可以看到你在正确的路径上设置权限只有创建函数。但是,我不明白为什么您需要为您的权限执行rest_condition:一个简单的不需要(IsAuthenticated)来覆盖默认设置就足够了。

+1

重读文档,听起来就像方法级别的权限只能比视图级别的权限**更严格**,这是我认为我正在努力的。这听起来是对的吗? – jdotjdot

+1

是的,这似乎是正确的。所以正确的做法可能是根据您的需要为每种方法设置权限。 – AdelaN

+0

或者您可以为您的视图使用自定义权限类:如果请求方法是POST(映射到创建)允许任何用户;否则,仅允许拥有该帐户或管理员的经过身份验证的用户。 [链接](http://www.django-rest-framework.org/api-guide/permissions#custom-permissions) – AdelaN