DRF视图集删除详细路线的权限

时间:2018-09-27 19:25:32

标签: django django-rest-framework django-permissions

我有一个基本的Viewset:

class UsersViewSet(viewsets.ModelViewSet):
    permission_classes = (OnlyStaff,)
    queryset = User.objects.all()
    serializer_class = UserSerializer

它绑定到/api/users/端点。我想创建一个用户个人资料页面,所以我只需要一个特定的用户,因此我可以从/api/users/<id>/中检索它,但是问题是我希望/api/users/<id>/被任何人都允许,但是{{ 1}}保留其权限/api/users/,因此没有人可以访问完整的用户列表。

注意:也许这不是一个很好的实现,因为任何人都可以强行使用使OnlyStaff复杂的数据,但是我愿意将其从id更改为<id>。 / p>

如何从明细路由中删除权限?

谢谢。

2 个答案:

答案 0 :(得分:2)

覆盖如下的 get_permissions() 方法

from rest_framework.permissions import AllowAny


class UsersViewSet(viewsets.ModelViewSet):
    permission_classes = (OnlyStaff,)
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def get_permissions(self):
        if self.action == 'retrieve':
            return [AllowAny(), ]        
        return super(UsersViewSet, self).get_permissions()

答案 1 :(得分:1)

如果您发布权限类,将会有所帮助。

但是从您发布的内容来看,似乎只有员工用户可以访问绑定到该视图集的端点。意味着没有其他用户类型/角色可以访问这些端点。

离开您的问题,似乎您想设置IsOwnerOrStaffOrReadOnly权限,并越过ModelViewSet的列表路由功能并替换Permission_classes,然后调用super

class UsersViewSet(viewsets.ModelViewSet):
    permission_classes = (IsOwnerOrStaffOrReadOnly,)
    queryset = User.objects.all()
    serializer_class = UserSerializer

def list(self, request, *arg, **kwargs):
   self.permission_classes = (OnlyStaffCanReadList,)
   super(UsersViewSet, self).list(request, *args, **kwargs)  // python3 super().list(request, *args, **kwargs)

是所有者对象权限类

class IsOwnerOrStaffOrReadOnly(permissions.BasePermission):

    def has_object_permission(self, request, view, obj):
        # Read permissions are allowed to any request,
        # so we'll always allow GET, HEAD or OPTIONS requests.
        if request.method in permissions.SAFE_METHODS:
            return True

        if request.user.role == 'staff': 
           return True
        # Instance must have an attribute named `owner`.
        return obj.owner == request.user

只有工作人员可以阅读权限等级

class OnlyStaffCanReadList(permissions.BasePermission):

    def has_object_permission(self, request, view, obj):
        if request.user.role == 'Staff': 
           return True
        else:
           return False

如注释中所提供,您的用户模型必须具有所有者角色。如果您使用的是django用户模型,则只需进行obj.id == request.user.id比较