我有一个基本的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>
如何从明细路由中删除权限?
谢谢。
答案 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
比较