Python LDAP:';填充Django用户';导致错误';访问权限不足';
我试图针对LDAP服务器对Django应用程序进行身份验证,并收到一些奇怪的行为。请记住,我对LDAP了解不多,所以如果我误用了一些LDAP术语,请原谅。还要注意,在整个问题中,my_domain是我公司的域名,user_id是身份验证用户的uid 以下是my settings.py配置文件的相关部分:Python LDAP:';填充Django用户';导致错误';访问权限不足';,python,django,authentication,ldap,django-auth-ldap,Python,Django,Authentication,Ldap,Django Auth Ldap,我试图针对LDAP服务器对Django应用程序进行身份验证,并收到一些奇怪的行为。请记住,我对LDAP了解不多,所以如果我误用了一些LDAP术语,请原谅。还要注意,在整个问题中,my_domain是我公司的域名,user_id是身份验证用户的uid 以下是my settings.py配置文件的相关部分: AUTHENTICATION_BACKENDS = [ 'django_auth_ldap.backend.LDAPBackend' ] AUTH_LDAP_SERVER_URI = '
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用户id
搜索返回了1个对象:uid=user\u id,cn=users,cn=accounts,dc=my\u domain,dc=com,0,“(objectClass=*)”)返回了1个对象:uid=user\u id,cn=users,cn=accounts,dc=my\u domain,dc=com
在验证用户\u id:访问权限不足({'desc':'访问权限不足'})时捕获Ldaperor
但是,当我将此标志从True翻转为false时:
AUTH_LDAP_ALWAYS_UPDATE_USER = False
身份验证成功。奇怪的是,即使身份验证成功,我的属性也没有映射到Django用户对象(在AUTH\u LDAP\u User\u ATTR\u MAP={“first\u name”:“givenName”,“last\u name”:“sn”}
中指定的属性)。当我手动检查request.user.ldap\u user.attrs时,所有属性都在那里
现在问题来了,“填充Django用户”到底意味着什么?是什么导致了“访问不足”错误?为什么翻转该标志可以修复(隐藏)问题
谢谢。通过将此行添加到我的settings.py文件中,我可以解决所有问题:
AUTH_LDAP_BIND_AS_AUTHENTICATING_USER = True
我一直打算绑定为身份验证用户。我没有要绑定的服务帐户,如果以匿名用户身份绑定到我公司的LDAP设置,则某些信息不可用。显然,发生的事情是在身份验证之后,使用匿名绑定对AUTH_LDAP_bind_DN进行了重新绑定,当然我没有指定。不允许匿名绑定访问组信息和其他详细信息,从而导致访问不足错误
从
默认情况下,所有LDAP操作都是使用AUTH_LDAP_BIND_DN和AUTH_LDAP_BIND_密码凭据执行的,而不是用户的。否则,LDAP连接将在登录请求期间绑定为身份验证用户,在其他请求期间绑定为默认凭据,因此根据Django视图的性质,您可能会看到不一致的LDAP属性。如果您愿意接受不一致性,以便在绑定为身份验证用户时检索属性,请参阅AUTH_LDAP_BIND_as_authentication_user
文档中关于以下内容的附加详细信息:
默认值:False
如果为True,身份验证将使LDAP连接绑定为
验证用户,而不是强制它与
身份验证成功后的默认凭据。这可能是
如果您没有能够
访问用户的属性。django auth ldap从不存储用户的
密码,因此这仅适用于用户所在的请求
认证的。因此,此设置的缺点是LDAP会导致
可能会根据用户是否已在系统中进行了早期身份验证而有所不同
Django视图,这可能会让不直接相关的代码感到惊讶
使用身份验证