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