0

我正在使用 django 身份验证后端django-auth-ldap对 LDAP 服务进行身份验证。尝试设置包含 ssl 证书的目录的路径时;

ldap.set_option(ldap.OPT_X_TLS_CACERTDIR, '/etc/ssl/certs')

我得到一个 ValueError 异常:

File "/Users/liz/web_application/work/ldap_settings.py", line 5, in <module>
ldap.set_option(ldap.OPT_X_TLS_CACERTDIR, '/etc/ssl/certs')

File "/Users/liz/.envs/dev/lib/python3.6/site-packages/ldap/functions.py", line 139, in set_option
return _ldap_function_call(None,_ldap.set_option,option,invalue)

File "/Users/liz/.envs/dev/lib/python3.6/site-packages/ldap/functions.py", line 66, in _ldap_function_call
result = func(*args,**kwargs)

ValueError: option error

我已经尝试了从以前的 SO 帖子中接受的答案,该答案建议卸载 python-ldap (尽管我使用的是pyldap,python-ldap 的一个分支)并使用 brew 安装的 openldap 重新安装,方法是运行:

LDFLAGS="-L/usr/local/brew/opt/openldap/lib" CPPFLAGS="-I/usr/local/brew/opt/openldap/include" pip install python-ldap

这似乎没有任何效果。我也按照本指南,使用较新版本的 openldap(通过 brew)在本地构建 pyldap 版本,但我仍然看到相同的错误。我不确定是否有某种方法可以验证我的本地构建是否使用了较新的 openldap 库,或者我是否在这里遗漏了什么?任何建议都非常感谢!

关于 SO 的其他现有问题

这个问题的答案对我没有影响;设置 AUTH_LDAP_GLOBAL_OPTIONS 而不是 set_option 会导致相同的 ValueError

AUTH_LDAP_GLOBAL_OPTIONS = {ldap.OPT_X_TLS_CACERTDIR: '/etc/ssl/certs'}
4

1 回答 1

0

好的,我有一些关于 LDAP 的工作。因此,如果对您有帮助,我会为您提供我的代码。首先,我将证书放入 django 项目中。

BASE_DIR = Djando base dir

def returnPaths():
    return     {'dn_full_path': 'CN=Person,CN=Schema,CN=your_con,DC=your_dc,DC=your_dc',
                'cert': 'path_to_cert_file',
                'host': 'ldaps://x.x.x.:636'
                }

class LdapBackend(object):
    @classmethod
    def authenticate(cls, username=None, password=None):

        try:
            setup = returnPaths()

            ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
            ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, BASE_DIR + setup['cert'])

            domain = 'your_doman'
            l = ldap.initialize(setup['host'])
            l.set_option(ldap.OPT_REFERRALS, 0)
            l.set_option(ldap.OPT_PROTOCOL_VERSION, 3)
            l.set_option(ldap.OPT_X_TLS, ldap.OPT_X_TLS_DEMAND)
            l.set_option(ldap.OPT_X_TLS_DEMAND, True)

            try:
                l.simple_bind_s('%s@%s' % (str(username.encode('utf-8')), domain),
                                password.encode('utf-8'))
                return True
            except ldap.INVALID_CREDENTIALS as e:
                return False
            except Exception as e:
                return False
        except ldap.INVALID_CREDENTIALS as e:
            return False
于 2017-06-27T14:06:00.037 回答