我正在使用Django REST框架访问一个名为'user'的资源。
由于用户信息是个人的,我不想通过GET请求列出系统中的每个用户,除非他们是管理员。
如果用户指定了他们的id,并且已经登录,我希望他们能够查看自己的详细信息并根据需要进行修改(PUT POST DELETE)。
因此,总结一下,在未经授权的情况下禁止任何人使用GET方法,但允许已登录的用户在查看自己的信息时使用GET POST DELETE PUT方法。
我创建了自定义权限类:
class UserPermissions(permissions.BasePermission):
"""
Owners of the object or admins can do anything.
Everyone else can do nothing.
"""
def has_permission(self, request, view):
# if admin: True otherwise False
def has_object_permission(self, request, view, obj):
# if request.user is the same user that is contained within the obj then allow
这不起作用。经过一些调试,我发现它首先检查has_permission
,然后再检查has_object_permission
。因此,如果我们不能通过GET /user/
的第一个障碍,那么它甚至不会考虑下一个GET /user/id
。
我该如何使其正常工作?
我正在使用ModelViewSets。
但是,如果您将列表功能与详细信息拆分,则可以为它们提供单独的权限类:
class UserList(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes=(UserPermissionsAll,)
class UserDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes=(UserPermissionsObj,)
class UserPermissionsAll(permissions.BasePermission):
"""
Owners of the object or admins can do anything.
Everyone else can do nothing.
"""
def has_permission(self, request, view):
if request.user.is_staff:
return True
else:
return False
class UserPermissionsObj(permissions.BasePermission):
"""
Owners of the object or admins can do anything.
Everyone else can do nothing.
"""
def has_object_permission(self, request, view, obj):
if request.user.is_staff:
return True
return obj == request.user
viewsets
。 - jfunk