Как обеспечить разделение на основе учетных записей в Джанго - PullRequest
1 голос
/ 03 декабря 2009

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 03 декабря 2009

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

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

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

  • Промежуточное программное обеспечение в режиме отладки, такое как Промежуточное программное обеспечение: средство проверки владения записями

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

  • Проверка всех запросов на наличие фильтра во время проверки кода

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

1 голос
/ 26 января 2010

Ух, у меня точно такая же проблема. Вот лучший ответ, который я получил:

Джанго: Как организовать этот большой беспорядок в модели / менеджере / дизайне?

0 голосов
/ 03 декабря 2009

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

0 голосов
/ 03 декабря 2009

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

Если это так, просто создайте учетную запись ForeignKey(User, unique=true) и укажите все свои модели на Пользователе

есть. ForeignKey(User)

Кроме того, взгляните на Django Auth Docs

edit: Думаю, теперь я понимаю вашу озабоченность немного лучше ...

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

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

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

request.user.my_model_set.all()
0 голосов
/ 03 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...