2017-06-26 18 views
0

django認証バックエンドdjango-auth-ldapを使用してLDAPサービスを認証しています。 ssl証明書を含むディレクトリへのパスを設定しようとしているとき。私はpyldapを使用していても(のpython-LDAPをアンインストールすることを示唆している。このprevious SO postから受け入れ答えを試してみたPython LDAP ValueError:set_option(ldap。OPT_X_TLS_CACERTDIR)を使用したときのオプションエラー

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 

、のpython-LDAPのフォーク:

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

私はとValueErrorの例外を取得します)を実行して、brew-installedのopenldapを使って再インストールしてください。

LDFLAGS="-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 = {ldap.OPT_X_TLS_CACERTDIR: '/etc/ssl/certs'} 
+1

そのフォルダのアクセス許可を確認します。 Djangoはそれにアクセスできますか? – marin

+0

はい、フォルダと内容はすべて読み取ることができます – Liz

+0

私はそれを追跡しましたが、TLSがlibldapで利用可能な場合にのみ、指定されたパスをオプション構造にコピーします。したがって、Pythonモジュールとlibldapの間には切断があるようです。 'ldd/usr/local/lib/python3.6/site-packages/_ldap.so'の出力を表示できますか? – Melvyn

答えて

0

[OK]を同じとValueErrorに代わりSET_OPTION結果のAUTH_LDAP_GLOBAL_OPTIONSを設定私は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('%[email protected]%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 
関連する問題