Использование страницы администратора 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 с пользовательской формой, для которой не требуется пароль.