Задать вопрос
Rrooom
@Rrooom

Как лучше контролировать доступ пользователя только к своим данным?

Предположим...
СИнтетический пример. У нас есть пользователи. У пользователей есть блокноты.
class Pad(Model):
   name = CharField()

В блокнотах есть записи:
class Post(Model):
   name = CharField()
   text = textField()
   pad = ForeignKey(Pad)

А к записям есть набор картинок:
class Img(Model):
   img = ImageField()
   post = ForeignKey(Post)


Как принято в django контроллировать доступ?
Сниппетом (да, я его забил в сниппеты) сразу генерю crud -ListView-DetailVIew-CreateView-UpdateView. Но как красиво дать доступ только владельцу?
Можно переопределить get_query_set. И для каждой вьюхе в нем запрашивать пользователя и фильтровать записи по нему. Слишком много кода. А для последнего в дереве связей - Img - вообще супердлинная цепочка доступа к владельцу блокнота, а уж в какой запрос это превращает орм - лучше не смотреть.
Можно в каждую модель добавить ключ на юзера - тогда можно сделать миксин на проверку сразу для всех, отнаследовав свои cbv. (А может есть модуль, который автоматом может проставлять владельца? Магия, но мало ли.)

Как лучше? Как вы решаете проблему?
У меня частенько бывало, что я просто забывал об этой фильтрации, пока меня не пинал тестер. Хочется максимально автомагического способа, что бы забыть об этом а всё было хорошо.
Кажется в джанге такой вопрос по-умолчанию не решен. И добавив нерелевантные теги, я надеюсь, кто-нибудь расскажет, как это реализвано в других фреймворках.
  • Вопрос задан
  • 2778 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
syschel
@syschel
freelance/python/django/backend
Как не крути, везде будет три запроса. К блокноту, записи и её картинкам. Достаточно блокноту дать связь на "владельца" ForeignKey(User) и проверять права в цепочке сначала права блокнота. И если прав хватило, то делать запрос к записи и картинкам.
Если хотите права более одного юзера на блокнот. То делать отдельную модель прав и через манитумани связывать.

P.S. Для обратных связей, можете использовать related_name
Ответ написан
Комментировать
soshnikov
@soshnikov
Погуглите "django row level security" - примеров и готовых решений есть.
Но, в любом случае, без проверки на владельца не обойтись.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы