2009-12-03 2 views
1

У меня есть приложение Django, которое имеет модель с одной учетной записью. Мы конвертируем это в мультисчет, поэтому почти каждая модель будет иметь ForeignKey(Account).Как обеспечить выравнивание на основе учетной записи в Django

Что является самым простым способом убедиться, что каждый Account (каждая учетная запись находится в собственном поддомене) может получить доступ только к своим собственным данным? У нас есть промежуточное ПО, которое заполняет субдомен и текущую учетную запись для каждого запроса.

Мы можем сделать это с трудом, добавив filter(...., account = request.account) во все наши взгляды. Это нежелательно, так как,

  1. filter(...., account = request.account) будет добавлено всех из запросов, что делает это не сухие, repetative и подвержены ошибкам.
  2. Большой риск - это если отсутствует недостающий фильтр, где бы то ни было риска для безопасности.

ответ

2

Я не думаю, что есть явный победитель, особенно если вы считаете, что не все запросы должны быть отфильтрованы по учетной записи. Также рассмотрите старый трюк , который считается ненадежным, что означает, что единственный способ сделать автоматическую вставку параметров фильтра будет с промежуточным программным обеспечением, я думаю ... но это также кажется ненадежным и сложным для меня.

У меня также не было хорошего способа сделать менеджер запросов, который может помочь здесь, но это может быть возможно.

Итак, я считаю, что лучшим решением для базы данных «multi-tenant» является только то, чтобы все ваши запросы были отфильтрованы по учетной записи. Вы можете сделать это с помощью:

  • Debug режим промежуточного слоя, такие как Middleware: Record ownership screener

  • В своих тестах проверить SQL, генерируемый любых тестов и проверить поле счета в запросе.Вы также можете включить данные «другой учетной записи» в свои тестовые приборы, которые, по вашему тесту, не будут отображаться в результатах любого запроса.

  • Убедившись все запросы проверяются на наличие фильтра во время проверки кода

Конечно, не очень, но лучшее, что я был в состоянии сделать до сих пор.

0

This фрагмент может поставить вас в правильном направлении. Я считаю, что разрешения на уровне строк также включены в список todo для 1.2, но не на 100% уверены в этом.

0

Есть ли какая-то огромная причина, почему вы не можете просто написать функцию, которая автоматически вставляет сессию в запрос и принимает все остальные параметры в качестве аргументов?

+2

Как бы вы получите 'request.session' в модели или менеджера без явной передачи его с каждым запросом. Если я пойду таким образом, я могу просто «фильтровать» каждый вызов. – agiliq

0

Вы используете django.contrib.auth?

Если вы просто сделать счета в ForeignKey(User, unique=true) и указать все свои модели на пользователя

т.е.. ForeignKey(User)

Также Взгляните на django Auth Docs

редактирования: Я думаю, я понимаю ваше беспокойство немного лучше ...

Вместо того чтобы делать

my_model.objects.filter(user=request.user) 

просто сделать :

request.user.my_model_set.all() 
+2

Да, но это все равно означает, что я должен поместить явный «фильтр» всюду. – agiliq

+0

, но вы можете просто начать с объекта пользователя: 'user.object1_set.all()' вместо 'object1.objects.filter (user = user)' – Jiaaro

Смежные вопросы