Ввод:
- только пользователи, прошедшие проверку подлинности, не могут читать публикации и изображения
- аутентифицированные пользователи могут создавать публикации и добавлять изображения
- авторизованные пользователи могут редактировать и удалять публикации и изображения, авторами которых они являются.
- пользователь с правами администратора может выполнять все действия, кроме УДАЛЕНИЯ. содержание
Код: Выделить всё
class Publication(models.Model):
pub_text = models.TextField(null=True, blank=True)
pub_date = models.DateTimeField(auto_now_add=True)
pub_author = models.ForeignKey(User, on_delete=models.CASCADE)
class Image(models.Model):
image = models.ImageField(upload_to='images', null=True)
image_to_pub = models.ForeignKey(Publication, on_delete=models.CASCADE, null=True, related_name='images')
Код: Выделить всё
class PublicationViewSet(viewsets.ModelViewSet):
queryset = Publication.objects.all()
serializer_class = PublicationSerializer
permission_classes = [PublicPermission]
class ImageViewSet(viewsets.ModelViewSet):
queryset = Image.objects.all()
serializer_class = ImageSerializer
permission_classes = [ImagePermission]
Код: Выделить всё
class ImagePermission(BasePermission):
edit_methods = ['PUT', 'PATCH']
def has_permission(self, request, view):
if request.method in SAFE_METHODS:
return True
if request.user.is_authenticated:
return True
def has_object_permission(self, request, view, obj):
if request.user.is_superuser:
return True
if request.method in SAFE_METHODS:
return True
if request.user.id == Publication.objects.get(id=obj.image_to_pub_id).pub_author_id:
return True
if request.user.is_staff and request.method not in self.edit_methods:
return True
return False
class ImageAuthorPermission(BasePermission):
def has_object_permission(self, request, view, obj):
if request.user.id == Publication.objects.get(id=obj.image_to_pub_id).pub_author_id:
return True
return False
Я имею в виду класс . В SAFE_METHODS есть два раза проверка метода.
Если я удалю эту проверку из , неаутентифицированные пользователи не будут иметь права только для чтения.
Если я удалю это извлечение из , прошедшие проверку подлинности пользователи не будут иметь прав на редактирование и удаление.
Я уверен, что есть лучший способ настроить эти разрешения. Не так ли?
Также я попытался проверить, есть ли у текущего пользователя разрешение на доступ к изображениям, связанным с публикацией, автором которой был пользователь. Это работает, но существует ли стандартная практика проверки разрешений для связанных объектов? Я пытался удалить чек
Код: Выделить всё
if request.user.is_staff and request.method not in self.edit_methods
. Б/у & и | операторов, но успеха не добился.
Подробнее здесь: https://stackoverflow.com/questions/790 ... -framework