Django rest framework为个别视图提供基于组的权限

17

我正在使用DRF编写API。我想为我的Modelviewsets中的每个视图提供不同的权限。我有两个组(客户和员工)。我已经在 permissions.py 中将它们过滤为Isstaff和Iscustomer。

class Iscustomer(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.user and request.user.groups.filter(name='customers'):
            return True
        return False


class Isstaff(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.user and request.user.groups.filter(name='staff'):
            return True
        return False

我正在尝试重写使用get_permissions方法。当我在self.permission_classes中放入一个单独的组时,它运行良好。

class cityviewset(viewsets.ModelViewSet):
    queryset = city.objects.all()
    serializer_class = citySerializer

    def get_permissions(self):    
        if self.request.method == 'POST' or self.request.method == 'DELETE':
            self.permission_classes = [Isstaff]
        return super(cityviewset, self).get_permissions()

但是,当我尝试将多个组放入self.permission_classes中时,它失败了。

def get_permissions(self):
    if self.request.method == 'POST' or self.request.method == 'DELETE':
        self.permission_classes = [Isstaff,Iscustomer,]
    return super(cityviewset, self).get_permissions()

你所说的“失败”是什么意思?有出现任何错误信息吗? - zaidfazil
1个回答

10

问题出在您给视图添加多个permission_classes的位置。检查您的permissions的方法是check_permissions()。如果您查看DRF代码,

def check_permissions(self, request):
    """
    Check if the request should be permitted.
    Raises an appropriate exception if the request is not permitted.
    """
    for permission in self.get_permissions():
        if not permission.has_permission(request, self):
            self.permission_denied(
                request, message=getattr(permission, 'message', None)
            )

当您提供多个permission_classes时,用户必须同时满足这些权限。因此,登录用户必须同时拥有员工和客户身份。我认为这就是您的视图失败的原因。


我已经添加了我的答案,请看一下。 - zaidfazil
抱歉回复晚了。已经明白了。谢谢。 - Jai Simha Ramanujapura

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接