0

我正在尝试针对 LDAP 服务器对 Django 应用程序进行身份验证,并且收到一些奇怪的行为。请记住,我对 LDAP 了解不多,所以如果我误用了一些 LDAP 术语,请见谅。另请注意,在整个问题中,my_domain 是我公司的域名,user_id 是身份验证用户的 uid。

这是我的 settings.py 配置文件的相关部分:

AUTHENTICATION_BACKENDS = [
    'django_auth_ldap.backend.LDAPBackend'
]
AUTH_LDAP_SERVER_URI = 'ldaps://ipa.my_domain.com:636'

AUTH_LDAP_USER_DN_TEMPLATE = "uid=%(user)s,cn=users,cn=accounts,dc=my_domain,dc=com"

AUTH_LDAP_USER_FLAGS_BY_GROUP = {
    "is_active": "cn=all,cn=groups,cn=accounts,dc=my_domain,dc=com",
    "is_staff": "cn=all,cn=groups,cn=accounts,dc=my_domain,dc=com",
    "is_superuser": "cn=all,cn=groups,cn=accounts,dc=my_domain,dc=com"
}

AUTH_LDAP_ALWAYS_UPDATE_USER = True
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()

AUTH_LDAP_GROUP_SEARCH = LDAPSearch("cn=groups,cn=accounts,dc=my_domain,dc=com",
    ldap.SCOPE_SUBTREE, "(objectClass=member)"
)

AUTH_LDAP_GLOBAL_OPTIONS = {
    ldap.OPT_X_TLS_REQUIRE_CERT: False,
    ldap.OPT_REFERRALS: False,
}

AUTH_LDAP_USER_ATTR_MAP = {"first_name": "givenName", "last_name": "sn"}

当我尝试登录我的应用程序时,我收到此错误:

填充 Django 用户 user_id search_s('uid=user_id,cn=users,cn=accounts,dc=my_domain,dc=com', 0, '(objectClass=*)') 返回 1 个对象:uid=user_id,cn=users, cn=accounts,dc=my_domain,dc=com 在验证 user_id 时捕获 LDAPError: INSUFFICIENT_ACCESS({'desc': 'Insufficient access'},)

但是,当我将此标志从 True 翻转为 false 时:

AUTH_LDAP_ALWAYS_UPDATE_USER = False

认证成功。现在这是奇怪的部分:即使身份验证成功,我的属性也没有映射到我的 Django User 对象(在 中指定的那些AUTH_LDAP_USER_ATTR_MAP = {"first_name": "givenName", "last_name": "sn"})。当我手动检查request.user.ldap_user.attrs所有属性时。

现在问题来了,“填充 Django 用户”到底是什么意思?是什么导致了“INSUFFICIENT_ACCESS”错误,为什么翻转那个标志会修复(隐藏?)问题?

谢谢。

4

1 回答 1

0

通过将此行添加到我的 settings.py 文件中,我能够解决所有问题:

AUTH_LDAP_BIND_AS_AUTHENTICATING_USER = True

我一直打算绑定为身份验证用户。我没有要绑定的服务帐户,如果以匿名用户身份与我公司的 LDAP 设置绑定,则某些信息不可用。显然发生的事情是在身份验证之后,使用匿名绑定对 AUTH_LDAP_BIND_DN 进行了重新绑定,当然我没有指定。不允许该匿名绑定访问组信息和其他详细信息,从而导致 INSUFFICIENT_ACCESS 错误。

文档

默认情况下,所有 LDAP 操作都使用 AUTH_LDAP_BIND_DN 和 AUTH_LDAP_BIND_PASSWORD 凭据执行,而不是使用用户的凭据。否则,LDAP 连接将在登录请求期间绑定为身份验证用户,并在其他请求期间绑定为默认凭据,因此您可能会看到不一致的 LDAP 属性,具体取决于 Django 视图的性质。如果您愿意接受不一致以便在绑定为身份验证用户时检索属性,请参阅 AUTH_LDAP_BIND_AS_AUTHENTICATING_USER。

有关AUTH_LDAP_BIND_AS_AUTHENTICATING_USER的文档中的其他详细信息:

默认值:假

如果为 True,则身份验证会将 LDAP 连接绑定为身份验证用户,而不是在身份验证成功后强制它使用默认凭据重新绑定。如果您没有能够访问用户属性的全局凭据,这可能是可取的。django-auth-ldap 从不存储用户的密码,所以这只适用于对用户进行身份验证的请求。因此,此设置的缺点是 LDAP 结果可能会根据用户是否在 Django 视图中较早地进行身份验证而有所不同,这对于不直接与身份验证相关的代码可能会令人惊讶。

于 2017-02-17T20:50:11.983 回答