Настройка/расширение/исправление обезьян Django Auth Backend

Я использую django-auth-ldap для подключения к серверу LDAP для аутентификации. django-auth-ldap предоставляет параметр AUTH_LDAP_REQUIRE_GROUP, который можно использовать для разрешения доступа только пользователям, помещенным в определенную группу. Это работает нормально, но опция позволяет проверить только одну группу; Я хочу проверить, помещены ли пользователи в ту или иную группу.

В модуле django_auth_ldap/backend.py я мог бы изменить метод _check_required_groups класса LDAPUser(object), чтобы реализовать это поведение. Его изменение напрямую работает нормально, но поскольку изменение источника приведет к аду обслуживания, я ищу решение для изменения этого метода, не касаясь источника. У меня было две идеи:

1) Исправление обезьян

Измените метод _check_required_groups экземпляра класса LDAPUser. Проблема в том, что я понятия не имею, где он создается. Я просто использую LDAPSearch и GroupOfNamesType, импортированные из django_auth_ldap.config в файл настроек, и передаю строку django_auth_ldap.backend.LDAPBackend в кортеж AUTHENTICATION_BACKENDS.

2) Расширение модуля

Создайте собственный модуль, расширив исходный django_auth_ldap и используя его вместо оригинала. Я попытался создать новый каталог, добавив __init__.py со строкой:

from django_auth_ldap import *

Но использование этого модуля не работает, так как он не может импортировать custom_auth.config.

Любые другие предложения или подсказки, как сделать одну из этих попыток работать?


person soerface    schedule 20.01.2014    source источник


Ответы (1)


Чтобы быть модульным, СУХИМ и верным философии django в целом, вам нужно создать класс с именем LDAPBackendEx, который будет наследоваться от LDAPBackend, и использовать этот класс для вашего AUTHENTICATION_BACKENDS вместо django_auth_ldap.backend.LDAPBackend. Кроме того, вы должны создать LDAPUserEx, который будет унаследован от _LDAPUser и переопределит метод _check_required_groups.

Итак, LDAPUserEx будет выглядеть примерно так:

class LDAPUserEx(_LDAPUser):
    def _check_required_group(self):
        pass # Put your implementation here !

Теперь, что касается реализации LDAPBackendEx: к сожалению, нет способа определить собственный класс _LDAPUser, поэтому вам придется искать каждый метод, использующий класс _LDAPUser, и переопределять его с помощью LDAPUserEx. Правильный метод реализации django-auth-ldap (и если бы нам действительно нужно было быть модульным) состоял бы в том, чтобы добавить атрибут user_class в LDAPBackend, инициализировать его значением _LDAPUser и использовать его вместо _LDAPUser.

Проверяя код здесь, я нашел из того, что методы LDAPBackend, которые ссылаются на _LDAPUser, это authenticate, get_user и get_group_permissions. Итак, реализация LDAPBackendEx будет примерно такой:

class LDAPBackendEx(LDAPBackend):
    def authenticate(self, username, password):
        ldap_user = LDAPUserEx(self, username=username)
        user = ldap_user.authenticate(password)
        return user

   def get_user(self, user_id):
       pass # please put definition of get_user here changing _LDAPUser to LDAPUserEx

   def get_group_permissions(self, user):
       pass # please put definition of get_group_permissions here changing _LDAPUser to LDAPUserEx        
person Serafeim    schedule 20.01.2014