2

因此,我正在用DRF編寫我的第一個項目,並且在設置我的視圖集的權限時遇到了一些問題。我已經使用djangorestframework-jwt進行了身份驗證。目前,我定義了幾個不同的ViewSet。我想要做的是允許模型對象的所有者對其想要的對象進行任何更改,但是阻止其他人(旁邊的管理員)查看對象。基本上,我需要一種將權限類應用於特定方法的方法,以便只允許管理員查看「列表」,所有者「更新,銷燬等」,並通過身份驗證的用戶進行「創建」。目前,我有這樣的事情:基於方法的django rest框架視圖集權限

class LinkViewSet(viewsets.ModelViewSet): 
    queryset = Link.objects.all() 
    serializer_class = LinkSerializer 

class Link(models.Model): 
    name = models.CharField(max_length=200) 
    url = models.URLField() 
    # another model with a OneToMany relationship 
    section = models.ForeignKey('homepage.LinkSection', related_name='links', on_delete=models.CASCADE 
    owner = models.ForeignKey('homepage.UserProfile'), related_name='links', on_delete=models.CASCADE) 

模型和權限類我想申請

class IsOwner(permissions.BasePermission): 
    def has_object_permissions(self, request, view, obj): 
     return obj.owner == request.user.userprofile 

我敢肯定,這可以通過實現這一目標編寫完全自定義的視圖,但我有一種直覺,有一種更簡單的方法來做到這一點,因爲這基本上是我必須做的最後一件事情來完成API。感謝您的幫助,如果您需要更多信息,請告訴我。

+0

你可以像'[DjangoModelPermissions](https://github.com/encode/django-rest-framework/blob/master/rest_framework/permissions.py#L75)一樣在'has_object_permission()'中檢查'request.method'。確實。 – kichik

+0

非常感謝你,我能弄明白,我會給帖子添加一個答案。 –

回答

3

我能夠通過檢查在視圖中使用了哪種行動創建權限類如下位置:

class IsOwner(permissions.BasePermission): 
''' 
Custom permission to only give the owner of the object access 
''' 
message = 'You must be the owner of this object' 

def has_permission(self, request, view): 
    if view.action == 'list' and not request.user.is_staff: 
     print('has_permission false') 
     return False 
    else: 
     print('has_permission true') 
     return True 

def has_object_permission(self, request, view, obj): 
    print('enter has_object_permission') 
    # only allow the owner to make changes 
    user = self.get_user_for_obj(obj) 
    print(f'user: {user.username}') 
    if request.user.is_staff: 
     print('has_object_permission true: staff') 
     return True 
    elif view.action == 'create': 
     print('has_object_permission true: create') 
     return True 
    elif user == request.user: 
     print('has_object_permission true: owner') 
     return True # in practice, an editor will have a profile 
    else: 
     print('has_object_permission false') 
     return False 

def get_user_for_obj(self, obj): 
    model = type(obj) 
    if model is models.UserProfile: 
     return obj.user 
    else: 
     return obj.owner.user 

get_user_for_obj是專爲我實現作爲一個輔助方法,因爲我的模型是如何不一致獲取用戶實例。您不想讓has_permission過於嚴格,因爲has_object_permission只有在has_permission返回True或未覆蓋該方法時纔會運行。

相關問題