2012-10-25 8 views
7

Otrzymuję niewystarczające błędy dostępu przy użyciu ldap_modify z OpenLDAP 2.4.32 i PHP 5.4.6.PHP ldap_modify Niewystarczający dostęp

Funkcja PHP, które daje błędy wygląda tak:

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

$ dn jest pełny DN użytkownik próbuje zmienić swoje dane wraz z ich hasłem. A dane $ to wartości, które aktualizują, teraz dane zawierają tylko numer telefonu do zmiany danych $ ["mobile"] = "newPhoneNumber". Wydaje się, że wszystko działa, z wyjątkiem faktu, że dane nigdy nie są faktycznie zapisane.

Plik openldap znajduje się poniżej, jak widać lista ACL mówi, że powinienem być w stanie do niej pisać.

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 

Pytanie brzmi, dlaczego PHP nie może zaktualizować wartości, a zamiast tego uzyskuje niewystarczający błąd dostępu?

+0

Przed wezwanie do ldap_connect(), spróbuj 'ldap_set_option (NULL, LDAP_OPT_DEBUG_LEVEL, 7);' który zrzuci kilka debugowania do globalnego dzienniku błędów Apache (to _will not_ zrzutu Do vhost specyficznych log lub do ustawienia 'error_log'.) – miken32

Odpowiedz

2

Aby rozwiązać problem, skorzystaj z narzędzia wiersza poleceń: ldapmodify, aby wykonać to samo żądanie. Może być konieczne zainstalowanie go w systemie (Redhat openldap-clients, Debian slapd).

LDAP Utilities

Ustalając poziom debugowania -d można miejmy nadzieję uzyskać więcej informacji, niż to, co biblioteka php jest dostarczanie informacji na temat przyczyn wywołanie wraca niewystarczającej błąd dostępu.

Choć nigdy nie miałem to zrobić z ldapmodify, użyłem go z ldapsearch z wielkim sukcesem. Więc może zająć trochę wyszukiwania lub ldapmodify --help, aby dowiedzieć się, jak z niego korzystać.

Wyobrażam polecenie będzie wyglądać mniej więcej tak:

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

Walczyłem z kilku rzeczy podczas zmiany hasła Active Directory. Może to pomoże również innym:

1st: Będziesz potrzebować bezpiecznego połączenia, inaczej LDAP odmówi zmiany hasła.

$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-ty: W moim systemie miałem problemy z uruchomieniem bezpiecznego połączenia, I rozwiązać to teraz edycję /etc/ldap/ldap.conf

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

3-te: Active Directory zastosowaliśmy unicodePwd pole zamiast pola userPassword. To pole wymaga ciągu znaków w kodzie Unicode.

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

4-ty: Do zmiany hasła nie można używać zamiast modify należy użyć mod_replace funkcję.

ldap_mod_replace($ldapConnection, $user_dn, $entry); 
Powiązane problemy