簡體   English   中英

POST對象的Django Rest Framework權限

[英]Django Rest Framework permissions of POST object

我正在為使用HyperlinkeRelatedFields等的超鏈接序列化程序實現自定義權限類。

該檢查非常粗略:

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是序列化特定的,並且序列化程序的驗證器部分中的檢查將是請求/ http特定的,而不僅僅是新模型的完整性/完整性檢查。

這樣做似乎很普通,所以我很好奇其他人采取的路線,如果缺少“更正確”的方法,我會很想念。

提前致謝。

鑒於注釋為POST ,我將假定這只是您正在處理的新對象的創建。

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

同樣,如果要處理PUT也可以將QuerySet限制為當前用戶:

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

(查看request.method in permissions.SAFE_METHODS中的request.method in permissions.SAFE_METHODS您可能需要根據請求方法執行此操作...)

這樣,用戶無法創建未附加到自己的對象,也無法更新他們尚未擁有的對象。

但是,與以往一樣, TIMTOWTDI ; 基於權限的路由沒有任何問題。 (我不確定這里是否有最終答案。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM