2012-10-25 15 views
7

Ricevo errori di accesso insufficienti utilizzando ldap_modify con OpenLDAP 2.4.32 e PHP 5.4.6.PHP ldap_modify Accesso insufficiente

la funzione PHP che sta dando gli errori si presenta così:

function set_user($dn, $password, $data) 
{ 
    /* This function sets the users infomation */ 

    // Get Configuration Items 
    $ldapServer = $this->config->item('ldapServer'); 
    $ldapDCRoot = $this->config->item('ldapDCRoot'); 


    // Connect to LDAP 
    $ldapConnection = ldap_connect($ldapServer); 

    if($ldapConnection) 
    { 
    $r = ldap_bind($ldapConnection, $dn, $password); 
    if ($r) 
    { 
     // Bind completed successfully 
     $r = ldap_modify($ldapConnection, $dn, $data); 
     return True; 
    } 
    die("Unsuccessful Bind"); 
    } 
    die("Can't connect to LDAP"); 
} 

Il $ dn è il DN completo dell'utente cercando di cambiare le loro informazioni con la loro password. E $ data sono i valori che stanno aggiornando, in questo momento i dati contengono solo il numero di telefono per cambiare $ data ['mobile'] = "newPhoneNumber". Sembra che tutto funzioni, tranne per il fatto che i dati non sono mai stati effettivamente scritti.

Il file openldap è incluso di seguito come è possibile vedere l'ACL dice che dovrei essere in grado di scrivere su di esso.

include  /etc/openldap/schema/corba.schema 
include  /etc/openldap/schema/core.schema 
include  /etc/openldap/schema/cosine.schema 
include  /etc/openldap/schema/duaconf.schema 
include  /etc/openldap/schema/dyngroup.schema 
include  /etc/openldap/schema/inetorgperson.schema 
include  /etc/openldap/schema/java.schema 
include  /etc/openldap/schema/misc.schema 
include  /etc/openldap/schema/nis.schema 
include  /etc/openldap/schema/openldap.schema 
include  /etc/openldap/schema/ppolicy.schema 
include  /etc/openldap/schema/collective.schema 

allow bind_v2 

pidfile  /var/run/openldap/slapd.pid 
argsfile /var/run/openldap/slapd.args 

TLSCertificateFile /etc/pki/tls/certs/slapd.pem 
TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem 

access to * 
    by self write 
    by users read 
    by anonymous auth 


database bdb 
suffix  "dc=example,dc=com" 
checkpoint 1024 15 
rootdn  "cn=manager,dc=example,dc=com" 
rootpw   REDACTED 

directory /var/lib/ldap 

index objectClass      eq,pres 
index ou,cn,mail,surname,givenname  eq,pres,sub 
index uidNumber,gidNumber,loginShell eq,pres 
index uid,memberUid      eq,pres,sub 
index nisMapName,nisMapEntry   eq,pres,sub 

La domanda è: perché PHP non può aggiornare il valore e ottiene invece un errore di accesso insufficiente?

+0

Prima la chiamata a ldap_connect(), provare 'ldap_set_option (NULL, LDAP_OPT_DEBUG_LEVEL, 7);' che scaricherà una serie di output di debug al log degli errori globale di Apache (che _will not_ discarica ad una specifica-vhost log, o all'impostazione 'error_log'.) – miken32

risposta

2

Per eseguire il debug del problema, suggerirei di utilizzare lo strumento da riga di comando ldapmodify per effettuare la stessa richiesta. Potrebbe essere necessario installarlo sul sistema (Redhat openldap-clients, Debian slapd).

LDAP Utilities

Impostando il livello di debug -d potete spera ottenere più informazioni rispetto a ciò che la libreria PHP sta fornendo circa il motivo per cui la chiamata viene restituita l'errore di accesso insufficiente.

Mentre non ho mai avuto a che fare questo con ldapmodify, ho usato con ldapsearch con grande successo. Quindi potrebbe richiedere un po 'di ricerca o ldapmodify --help per capire come usarlo.

immagino il comando sarebbe simile a questa:

ldapmodify -d 7 -h ldap.server.com -D bind_dn -w bind_password -f /tmp/entrymods 
0

ho lottato con un paio di cose, mentre la modifica della password di Active Directory. Forse questo aiuterà anche gli altri:

1 °: Avrai bisogno di una connessione sicura altrimenti LDAP rifiuterebbe di cambiare la password.

$this->ldap_ds = ldap_connect($this->hostname); 
//some protocol options 
ldap_set_option($this->ldap_ds, LDAP_OPT_REFERRALS, 0); 
ldap_set_option($this->ldap_ds, LDAP_OPT_PROTOCOL_VERSION, 3); 

// start secure connection on port 636 
ldap_start_tls($this->ldap_ds); 

2 °: Sul mio sistema ho avuto problemi di avvio del collegamento sicuro, ho risolto questo per ora l'editing /etc/ldap/ldap.conf

# TLS_CACERT /etc/ssl/certs/ca-certificates.crt 
TLS_REQCERT never 

3 °: per Active Directory abbiamo usato il unicodePwd campo invece del campo userPassword. Questo campo richiede una stringa in Unicode.

$entry["unicodePwd"] = iconv("UTF-8", "UTF-16LE", '"' . $newPassword . '"'); 

4: Per la modifica della password non è possibile utilizzare modify invece si dovrebbe utilizzare la funzione mod_replace.

ldap_mod_replace($ldapConnection, $user_dn, $entry); 
Problemi correlati