具有LDAP和本地帐户的Django Auth

时间:2019-04-24 10:48:20

标签: python django ldap

我目前正在使用Django和LDAP。但是,我想将LDAP身份验证限制为仅本地帐户DB中的帐户。 即如果没有本地帐户,则拒绝访问/ ldap身份验证。

通过查看LDAPSearch中的选项,我无法找到提供此选项的直接选项。关于如何实现这一目标的任何想法?

基于LDAP OU的限制不是基于现有LDAP地址结构的选项。

谢谢

1 个答案:

答案 0 :(得分:2)

正如felix001在评论中指出的那样,项目文档描述了一个标志AUTH_LDAP_NO_NEW_USERS

  

防止在身份验证期间创建新用户。尚未在Django用户数据库中的所有用户将无法登录。

在设置中启用它会打开所需的行为:

# settings.py

...

AUTH_LDAP_NO_NEW_USERS = True

但是,当前发布的1.7.0版本不包含此功能,因此需要反向移植。我能想到的侵入性最小的隐喻是:

# myapp/backend.py

from django_auth_ldap import backend as ldap_backend


# backport for AUTH_LDAP_NO_NEW_USERS setting
ldap_backend.LDAPSettings.defaults.update(NO_NEW_USERS=False)


class MyLDAPBackend(ldap_backend.LDAPBackend):

    def get_or_build_user(self, username, ldap_user):
        user, built = super().get_or_build_user(username, ldap_user)
        if self.settings.NO_NEW_USERS and built:  # user was not found in local db and created instead
            raise ldap_user.AuthenticationFailed(
                f'username {username} does not exist in local DB.'
            )
        return user, built

在设置中激活AUTH_LDAP_NO_NEW_USERS并暂时使用自定义后端而不是LDAPBackend

# myapp/settings.py

AUTH_LDAP_NO_NEW_USERS = True
AUTHENTICATION_BACKENDS += ('myapp.backend.MyLDAPBackend',)

删除后备端口也很容易:发布django-auth-ldap的下一版本后,您唯一需要修改的就是AUTHENTICATION_BACKENDS元组(当然,请删除{{1} }模块)。