2016-09-05 10 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의 요구 사항입니까?

편집 :

변경 한 후 코드가 시간의 약 90 %를 일할 것 같았다 dnuser.entry_get_dn()에. 이 테스트를 오늘 다시 실행 한 후에는 현재 일관되게 작동합니다. 나는 이것을 디렉토리 브라우저에서 신선한 데이터를 보지 못하도록 묵과 할 것입니다.

+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