LDAP:'填充Django用户'导致错误'INSUFFICIENT_ACCESS'

时间:2017-02-13 16:09:12

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

我正在尝试针对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翻转为假时:

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'错误的原因是什么,以及为什么翻转那个标志修复(隐藏?)问题?

感谢。

1 个答案:

答案 0 :(得分:0)

我可以通过将此行添加到我的settings.py文件来解决所有问题:

AUTH_LDAP_BIND_AS_AUTHENTICATING_USER = True

我的意图是整个时间绑定为身份验证用户。我没有要绑定的服务帐户,如果以我公司的LDAP设置绑定为匿名用户,则某些信息不可用。显然,正在发生的事情是在身份验证之后,AUTH_LDAP_BIND_DN正在重新绑定,当然我没有使用匿名绑定指定。该匿名绑定不允许访问组信息和其他详细信息,导致INSUFFICIENT_ACCESS错误。

来自documentation

  

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

有关AUTH_LDAP_BIND_AS_AUTHENTICATING_USER的文档中的添加详细信息:

  

默认值:False

     

如果为True,则身份验证将使LDAP连接保持为   验证用户,而不是强制它重新绑定   身份验证成功后的默认凭据。这可能是   如果您没有能够使用的全局凭据,则需要   访问用户的属性。 django-auth-ldap永远不会存储用户的   密码,因此这仅适用于用户所在的请求   认证。因此,此设置的缺点是LDAP结果   可能会根据用户之前是否通过身份验证而有所不同   Django视图,这可能令人惊讶,代码没有直接关注   用身份验证。