我使用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
我已经尝试了这个previous SO post中接受的答案,建议卸载python-ldap(尽管我使用pyldap,python-ldap的一个分支)并重新安装通过运行:
使用brew安装的openldapLDFLAGS="-L/usr/local/brew/opt/openldap/lib" CPPFLAGS="-I/usr/local/brew/opt/openldap/include" pip install python-ldap
这似乎没有效果。我也跟着this guide,用更新版本的openldap(通过brew)本地构建了一个版本的pyldap,但我仍然看到同样的错误。我不确定我是否可以通过某种方式验证我的本地版本是否使用了较新的openldap库,或者是否有我在这里丢失的内容?任何建议都非常感谢!
关于SO的其他现有问题
this question的答案对我没有影响;设置AUTH_LDAP_GLOBAL_OPTIONS而不是set_option导致相同的ValueError
AUTH_LDAP_GLOBAL_OPTIONS = {ldap.OPT_X_TLS_CACERTDIR: '/etc/ssl/certs'}
答案 0 :(得分:0)
好的我有一些关于LDAP的工作。如果这有助于你,我会为你提供我的代码。首先,我将证书放入django procject。
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