我正在使用OpenLDAP,我想使用Django_auth_ldap将其连接到Django。无论我试图遵循什么选项,它都无法正常工作,我也找不到正确的解决方案。
以下是使用的各种软件的版本:
- OpenLDAP 20423(LDAPv3)
- Django 1.4.1或1.4.3(我都试过了)
- django_auth_ldap 1.1.3
我的LDAP目录有一个名为noc.noc
的用户,我正在使用它来进行测试。
我用以下行更新了settings.py
文件:
import ldap, logging
from django_auth_ldap.config import LDAPSearch, PosixGroupType
.
.
.
logger = logging.getLogger('django_auth_ldap')
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)
AUTHENTICATION_BACKENDS = (
'django_auth_ldap.backend.LDAPBackend',
'django.contrib.auth.backends.ModelBackend',
)
AUTH_LDAP_SERVER_URI = "ldap://ldap.XXX.XX"
AUTH_LDAP_BIND_DN = "cn=<LDAPUSER>,dc=XXX,dc=XX"
AUTH_LDAP_BIND_PASSWORD = "<LDAPPASSWORD>"
AUTH_LDAP_USER_SEARCH = LDAPSearch("dc=XXX,dc=XX",
ldap.SCOPE_SUBTREE, "(uid=%(user)s)")
AUTH_LDAP_GROUP_TYPE = PosixGroupType(name_attr='cn')
AUTH_LDAP_REQUIRE_GROUP = "cn=<USERGROUP>,ou=Groups,dc=XXX,dc=XX"
AUTH_LDAP_GROUP_SEARCH = LDAPSearch("ou=Groups,dc=XXX,dc=XX",
ldap.SCOPE_SUBTREE, "(objectClass=posixGroup)"
)
AUTH_LDAP_USER_ATTR_MAP = {
'first_name': 'givenName',
'last_name': 'sn',
'email': 'mail',
}
当我尝试在Django接口上连接noc.noc
用户时,我有以下日志消息:
search_s('dc=XXX,dc=XX', 2, '(uid=%(user)s)') returned 1 objects:
cn=noc.noc,ou=users,dc=XXX,dc=XX
cn=noc.noc,ou=users,dc=XXX,dc=XX is not a member of cn=<USERGROUP>,ou=groups,dc=XXX,dc=XX
Authentication failed for noc.noc
如果我删除行:
AUTH_LDAP_REQUIRE_GROUP = "cn=<USERGROUP>,ou=Groups,dc=XXX,dc=XX"
与接口的连接是有效的,但它也适用于LDAP数据库中的任何用户,这不是我想要的。
我还使用以下命令检查了用户是否在ldap数据库中以及是否在正确的组中:
ldapsearch -h 'ldap.XXX.XX' -D 'cn=<LDAPUSER>,dc=XXX,dc=XX' -w '<LDAPPASSWORD>' -b 'cn=<USERGROUP>,ou=Groups,dc=XXX,dc=XX'
结果是:
# extended LDIF
#
# LDAPv3
# base <cn=<USERGROUP>,ou=Groups,dc=XXX,dc=XX> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# <USERGROUP>, Groups, XXX.XX
dn: cn=<USERGROUP>,ou=Groups,dc=XXX,dc=XX
cn: <USERGROUP>
gidNumber: 501
memberUid: cn=user1,ou=Users,dc=XXX,dc=XX
memberUid: cn=noc.noc,ou=Users,dc=XXX,dc=XX
objectClass: posixGroup
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
我在settings.py
中尝试了其他参数,并在网上寻找类似的问题,但我读到的解决方案都没有解决我的问题。
非常感谢你的帮助。
Django auth-ldap使用CN来标识组成员,而不是DN。因此,解决方案是更换:
cn=noc.noc,ou=Users,dc=XXX,dc=XX
在LDAP中组的memberUid
字段中,通过:
noc.noc
这就解决了问题。
另一个解决方案是修改django-auth-ldap的来源。为此,您必须编辑文件config.py
(在我安装的/usr/local/lib/python2.6/dist-packages/django-auth-ldap中找到),并找到名为的函数
def user_groups(self, ldap_user, group_search):
同类:
class PosixGroupType(LDAPGroupType):
然后更换线路:
user_uid = ldap_user.attrs['uid'][0]
发件人:
user_uid = ldap_user.dn
这也应该奏效。