Использование страницы администратора Django для добавления пользователей с другими пользователями AUTHENTICATION_BACKEND

Я использую django_auth_ldap для аутентификации пользователей для проекта Django в большой корпоративной системе ActiveDirectory, которая не организована полезным способом (и у меня нет возможности ее изменить). Поэтому я должен добавлять пользователей по отдельности, чтобы у меня не было ни одного пользователя, который мог бы аутентифицироваться на LDAP и мог войти в систему. Можно добавить пользователей LDAP в командной строке, используя

from django_auth_ldap.backend import LDAPBackend

user = LDAPBackend().populate_user('alice')

но я не могу использовать страницу администратора, чтобы сделать то же самое (добавление пользователя вынуждает меня вводить пароль, а не просто заставляет учетную запись наследовать уже существующие учетные данные LDAP).

Может показаться, что нет простого / умного способа сделать это без необходимости писать страницу администрирования django (хотя, если я ошибаюсь, поправьте меня). Как добавить простую страницу администратора, которая просто создает пользователя без установки пароля или чего-либо еще?

Я понимаю, что основная механика в основном включает в себя что-то вроде:

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

UserAdmin.add_form_template = ('addLDAPuser.html')

admin.site.unregister(User)
admin.site.register(User,UserAdmin)

но я все еще не совсем уверен в том, что могу создать шаблон и логику обработки, чтобы у меня не было в конечном итоге множества учетных записей пользователей, которые будут успешно аутентифицироваться против django.contrib.auth.backends.ModelBackend с пустыми паролями. (Очевидно, я мог бы просто удалить django.contrib.auth.backends.ModelBackend от AUTHENTICATION_BACKENDS в settings.py, но это также лишает меня возможности иметь локальную учетную запись администратора отдельно от LDAP.)

2 ответа

Решение

Вы можете попробовать расширить стандартную модель пользователя и переопределить ее метод save(). Обязательно прочитайте о последствиях переопределения метода сохранения здесь. Такая модель может выглядеть так:

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class LDAPUser(models.Model):
        user = models.OneToOneField(User, editable=False)
        username = models.CharField(max_length=32, unique=True)

        def save(self, *args, **kwargs):
                self.user, _ = User.objects.get_or_create(username=self.username)
                self.user.save()
                '''
                Do custom saving here:
                from django_auth_ldap.backend import LDAPBackend

                user = LDAPBackend().populate_user('alice')
                '''
                super(LDAPUser, self).save(*args, **kwargs)

        def __unicode__(self):
                return self.username

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

К сожалению, я не думаю, что есть чистый способ сделать это без написания вашей пользовательской страницы администратора.

Однако я бы не боялся этого. Просто создайте новый ModelAdmin для модели auth.User с пользовательской формой, для которой не требуется пароль.

Другие вопросы по тегам