2014-06-19 190 views
0

我正在爲使用HyperlinkeRelatedFields等的超鏈接序列化程序實現自定義權限類。Django Rest POST對象的框架權限

的檢查是非常粗略:

def has_permission(self, request,view): 
    if request.method in permissions.SAFE_METHODS: 
     return True 

    if not request.user.is_authenticated(): 
     return False 

    if request.user.is_staff: 
     return True 

    # POST: 'author' is a URL due to serializer being Hyperlinked 
    # meaning we have to translate URL to model (like the serializer) 
    # to perform the check 
    if url_to_user(request.DATA['author']) == request.user: 
     return True 

鑑於該代碼的註釋,好像它可能是最好有串行驗證過程中做此項檢查,儘管這將轉移的擔憂。這幾乎就像驗證類需要一個在調用save()之前傳遞新對象的方法來檢查POST/PUT從權限角度來看是可以接受的,而不是通過HTTP /權限相關檢查來驗證序列化程序。

url_to_user是序列化特定的,並且檢查序列化器的驗證器部分將是request/http特定的,而不僅僅是對新模型的完整性/完整性檢查。

這似乎是一個普遍的事情,我很好奇哪些路線的其他人採取了,如果有一個「更正確」的方法,我失蹤了。

在此先感謝。

回答

0

鑑於評論說POST,我假設它只是創建一個新的對象,你正在處理。

由於author必須是request.user,因此不需要將其設置爲可寫字段。我只需在pre_save中將對象的作者屬性設置爲當前用戶。

同樣的,如果你想處理PUT可以將QuerySet限制到當前用戶太:

def get_queryset(self): 
    return MyClass.objects.filter(author=self.request.user) 

(在request.method in permissions.SAFE_METHODS尋找你可能需要基於請求的方法來做到這一點...)

用這種方式,用戶不能創建一個未連接到自己的對象,也不能更新它們尚未擁有的對象。

然而,如以往一樣,TIMTOWTDI;基於權限的路由沒有任何問題。 (我不確定這裏有最終答案。)