2

我正在使用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使用空密码进行身份验证。(显然,我可以django.contrib.auth.backends.ModelBackend从insettings.py 中删除AUTHENTICATION_BACKENDS,但这也使我无法将本地管理员帐户与 LDAP 分开。)

4

2 回答 2

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

于 2013-10-15T14:46:07.467 回答
0

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

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

于 2013-10-02T19:33:19.183 回答