2012-10-25 5 views
7

Ich bekomme nicht genügend Zugriffsfehler mit ldap_modify mit OpenLDAP 2.4.32 und PHP 5.4.6.PHP ldap_modify Unzureichender Zugriff

Die PHP-Funktion, der die Fehler geben sieht wie folgt aus:

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"); 
} 

Die $ dn die volle DN des Benutzers versuchen, ihre Informationen zusammen mit ihr Passwort zu ändern. Und $ data sind die Werte, die sie aktualisieren, gerade jetzt enthalten Daten nur die Telefonnummer, um $ data ['mobile'] = "newPhoneNumber" zu ändern. Dies scheint alles zu funktionieren, außer dass die Daten nie wirklich geschrieben wurden.

Die Openldap-Datei ist unten enthalten, wie Sie sehen können die ACL sagt, dass ich in der Lage sein sollte, darauf zu schreiben.

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 

Die Frage ist, warum kann PHP den Wert nicht aktualisieren und erhält stattdessen einen unzureichenden Zugriffsfehler?

+0

Bevor Sie Ihr Anruf(), um ldap_connect, versucht 'ldap_set_option (NULL, LDAP_OPT_DEBUG_LEVEL, 7);', die eine Reihe von Debug-Ausgabe an dem Apache globalen Fehlerprotokoll-Dump wird (es _will not_ Dump ein vhost spezifische log oder zu Ihrer 'error_log' Einstellung.) – miken32

Antwort

2

Um Ihr Problem zu debuggen, würde ich empfehlen, das Befehlszeilenprogramm ldapmodify zu verwenden, um die gleiche Anforderung zu stellen. Möglicherweise müssen Sie es auf Ihrem System installieren (Redhat openldap-clients, Debian slapd).

LDAP Utilities

Durch das Debugging-Level Einstellung -d Sie hoffentlich weitere Informationen erhalten, können als das, was die PHP-Bibliothek bietet darüber, warum Ihr Anruf wird die unzureichenden Zugriffsfehler zurück.

Während ich noch nie mit diesem ldapmodify, zu tun hatte, habe ich es mit ldapsearch mit großem Erfolg eingesetzt. So kann es einige Suche oder ldapmodify --help benötigen, um herauszufinden, wie man es benutzt.

Ich stelle mir den Befehl wie folgt aussehen würde:

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

ich mit ein paar Dinge zu kämpfen, während Active Directory-Kennwort zu ändern. Vielleicht hilft dies auch anderen:

1st: Sie benötigen eine sichere Verbindung, sonst würde LDAP das Passwort nicht ändern.

$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.: Auf meinem System hatte ich Probleme, die eine sichere Verbindung starten, löste ich das jetzt Bearbeitung /etc/ldap/ldap.conf

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

3.: Für Active Directory wir die unicodePwd verwendet Feld statt userPassword Feld. Dieses Feld erfordert einen String in Unicode.

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

4.: Für Passwort ändern Sie modify nicht stattdessen verwenden können Sie mod_replace Funktion verwenden sollten.

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