簡體   English   中英

如何將自定義值從 DRF ModelViewSet 傳遞到權限 class?

[英]How can custom values be passed from a DRF ModelViewSet to a permissions class?

我已經設置了一個自定義權限 class以從多個視圖中重用,在一個應用程序中,一些用戶代表其他用戶擁有類似所有權的權限:

class IsOwnerLike(permissions.BasePermission):
    def has_permission(self, request, view):
        if (
            user_is_owner(request.user, request.data["owned_by"])
            | user_is_owner_like(request.user, request.data["owned_by"])
        ):
            return True

        return False

對於一個 ModelViewSet,這可以按預期工作。

但是,由於遺留原因,進入不同視圖的不同請求可能沒有“owned_by”數據元素——它可能被稱為“owned”、“owner”、“created_by”等——因此我不能重用此自定義權限。

在視圖集中抽象事物、規范傳遞給我的自定義權限 class 的數據的正確方法是什么? 可以這樣做,還是我應該考慮以不同的方式處理這些權限?

找到了解決辦法。

我能夠向視圖添加自定義屬性:

class ViewOne(ModelViewSet):
    ownership_fieldname = "owned_by"
    permission_classes = [IsOwnerLike]

    ...

class ViewTwo(ModelViewSet):
    ownership_fieldname = "owner"
    permission_classes = [IsOwnerLike]
    ...

然后在權限中訪問它:

class IsOwnerLike(permissions.BasePermission):
    def has_permission(self, request, view):
        if (
            user_is_owner(request.user, request.data[view.ownership_fieldname])
            | user_is_owner_like(request.user, request.data[view.ownership_fieldname])
        ):
            return True

        return False

您應該從 has_object_permission 使用 object 檢查 model 訪問權限,如下所示:

    def has_object_permission(self, request, view, obj):
        if hasattr(obj, 'owner'):
           if obj.user == request.user:
              return True
        return False

您可以使用模型所有者字段名稱更改所有者

對於將所有者 kwargs 傳遞給權限 class 您應該從 ModelViewSet 編寫 custommModelViewSet 和 inheritance 並覆蓋 get_permissions() 方法

暫無
暫無

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

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