2016-09-05 39 views
2

OpenLDAPサーバーに対してldap3のpythonモジュールを使用してユーザーのパスワードを変更できないようです。同様の質問がbeforeと尋ねられましたが、これはActive Directory固有のものです。ldap3ライブラリを使用してOpenLDAPのuserPasswordを変更する

私が試したもの:

from ldap3.extend.standard.modifyPassword import ModifyPassword 
from ldap3.utils.hashed import hashed 
password = hashed(HASHED_SALTED_SHA, password) 
# or.. 
password = '{SASL}[email protected]' 
modify = ModifyPassword(
    connection, user.entry_get_dn(), new_password=password) 
resp = modify.send() 
print(modify.result) 
{'referrals': None, 'result': 0, 'description': 'success', 'type': 'extendedResp', 'message': '', 'responseName': None, 'new_password': None, 'dn': '', 'responseValue': None} 

を説明成功は述べていますが、パスワードは実際には変更されません。

私は、メッセージを交換する変更を送信しようとしました:

def modify_user_password(self, user, password): 
    dn = user.entry_get_dn() 
    hashed_password = hashed(HASHED_SALTED_SHA, 'MyStupidPassword') 
    changes = { 
     'userPassword': [(MODIFY_REPLACE, [hashed_password])] 
    } 
    logger.debug('dn: ' + dn) 
    logger.debug('changes: ' + str(changes)) 
    success = self.engage_conn.modify(dn, changes=changes) 
    if success: 
     logger.debug('Changed password for: %s', dn) 
     print(self.engage_conn.result) 
    else: 
     logger.warn('Unable to change password for %s', dn) 
     logger.debug(str(self.engage_conn.result)) 
     raise ValueError('stop') 

接続がない SSL接続です。広告に関する質問への答えは、接続がSSL経由であることが必要です。これもOpenLDAPの要件ですか?

編集:dnuser.entry_get_dn()にコードを変更した後

は、時間の約90%を動作するように見えました。今日、これらのテストをもう一度実行した後は、一貫して動作するように見えます。私はこれをチョークして、ディレクトリブラウザで新鮮なデータを表示しないようにします。

+0

自分でoasswordをハッシュしないでください。サーバーにそれをさせてください。 – EJP

+0

@EJPサーバーに処理させようとすると、結果はプレーンテキストのパスワードになります。これを修正するサーバー側の設定があるかもしれませんが、私の状況では有効になっていません。 –

+0

これで、サーバーを誤って構成しました。 – EJP

答えて

1

パスワードを変更すると、ドキュメントに記載されているように動作し、上記の質問の編集に表示されます。

  1. これは、OpenLDAPサーバに接続している(複数のデータベースを持つ)
  2. NO SSLがあります:

    from ldap3 import (
        HASHED_SALTED_SHA, MODIFY_REPLACE 
    ) 
    from ldap3.utils.hashed import hashed 
    
    def modify_user_password(self, user, password): 
        dn = user.entry_get_dn() 
        hashed_password = hashed(HASHED_SALTED_SHA, password) 
        changes = { 
         'userPassword': [(MODIFY_REPLACE, [hashed_password])] 
        } 
        success = self.connection.modify(dn, changes=changes) 
        if not success: 
         print('Unable to change password for %s' % dn) 
         print(self.connection.result) 
         raise ValueError('Unable to change password') 
    

    は、いくつかのことを明確にするために:今後の参考のために、このコードは動作しているようですここに。私たちはSSLの実装を計画していますが、SSLなしで動作します。

+0

Ldap3には、userPasswordを変更するための特定の機能が含まれています。 connection.extend.standard.modify_password()メソッドを見てください。 – cannatag

関連する問題