使用Django管理页面添加其他AUTHENTICATION_BACKEND用户

时间:2013-10-02 17:58:02

标签: python django django-admin django-authentication django-auth-ldap

我正在使用django_auth_ldap针对大型企业ActiveDirectory系统对Django项目的用户进行身份验证,该系统没有以有用的方式组织(我无法更改它)。因此,我必须单独添加用户,这样我就不会有任何可以通过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进行身份验证。 (显然,我可以从settings.py中的django.contrib.auth.backends.ModelBackend删除AUTHENTICATION_BACKENDS,但这也会删除我将本地管理员帐户与LDAP分开的功能。)

2 个答案:

答案 0 :(得分:2)

您可以尝试扩展标准用户模型并覆盖其save()方法。 Make sure you read up on the consequences of overriding the save method here。这样的模型看起来像这样:

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用户身份验证的唯一方式..

答案 1 :(得分:0)

不幸的是,如果不编写自定义管理页面,我认为没有一种干净的方法。

然而,我不会那么害怕它。只需使用自定义表单为auth.User模型创建一个新的ModelAdmin,不需要密码。