2014-07-03 130 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

相關問題