Я использую Django REST Framework для доступа к ресурсу 'user'.
Поскольку информация пользователя является личной, я не хочу, чтобы запрос 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, THEN проверяет has_object_permission. Поэтому, если мы не преодолеем этот первый барьер GET/user/, тогда он даже не рассмотрит следующий GET/user/id.
Итак, кто-нибудь знает, как я собираюсь заставить это работать?
Спасибо:)
EDIT:
Я использовал 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