Я использую Django REST Framework для доступа к «пользователю» ресурса.
Поскольку информация о пользователе является личной, я не хочу, чтобы запрос GET перечислял всех пользователей в системе, ЕСЛИ они не являются администраторами.
Если пользователь указывает свой идентификатор, и они вошли в систему, я хотел бы, чтобы они могли просматривать свои данные и изменять их (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
. - person jfunk   schedule 06.06.2016