1

我正在使用 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',
}

当我尝试noc.noc在我的 Django 界面上与用户连接时,我收到以下日志消息:

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并在网上寻找类似的问题,但我阅读的解决方案没有解决我的问题。

非常感谢你的帮助。

4

1 回答 1

2

Django-auth-ldap 使用 CN 来识别组成员而不是 DN。为此,解决方案是替换:

cn=noc.noc,ou=Users,dc=XXX,dc=XX

memberUidLDAP 中的组字段中:

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

这也应该可以解决问题。

于 2013-02-06T08:52:58.697 回答