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或未覆盖该方法时才会运行。

相关问题