2013-09-20 5 views
1

Каков наилучший способ отделить логику аутентификации от кода, который по своей сути зависит от него?Django - отдельный код внутренней аутентификации от реализации

Общая проблема: django_auth_ldap не препопыляет таблицу пользователей, а проверяет подлинность LDAP и добавляет пользователей в таблицу при первом входе в систему.

Однако скажите, что мы пишем приложение, которое включает в себя добавление членов в проекты. Пользователи могут захотеть добавить других пользователей, которые существуют в LDAP, но ранее не вошли в систему, поэтому вам в основном требуется ввести имя пользователя в этом случае и запросить LDAP и базу данных, чтобы узнать, существует ли этот пользователь. Опять же, если мы пишем приложение для повторного использования, мы бы хотели, чтобы подпрограмма «lookup by username» настраивалась.

На работе у нас было два разных решения проблемы, которые прекрасно работают, но это своего рода странные решения.

  • Сделать так, вы можете написать функцию get_user_by_username в settings.py, который делает все, что поиски вы хотите
  • Дайте «appname.modelname» путь к прокси-модели auth.User вы создали, который ожидаемый/вынуждены иметь classmethod, который делает то же самое, как get_user_by_username

Я думаю, что первый из них является немного чище, так как он не вводит новых типов, но это все-таки странно, что нужно иметь в settings.py ,

ответ

2

Предлагаю написать abstract base class, который инкапсулирует ожидаемую функциональность. Это действует как интерфейс на языках программирования, таких как C# и Java. Затем установите параметр django, который указывает класс, который будет использоваться для провайдера get_user_by_username.

Это означает, что будущие разработчики могут поместить свою реализацию get_user_by_username в любом месте, где они сочтут нужным, если она реализована в классе, полученном из абстрактного базового класса, и они указывают на него в настройках.

+0

Я думаю, что это более стандартный подход OO. ABCMeta Я думаю, что это намного больше, чем мне нужно. Если я структурировал его так, как Django, его классы Backend, которые устраняют необходимость в прокси-модели (которая, как я заметил, иногда может вызвать непредвиденные проблемы). – OEP

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