2012-10-25 62 views
7

Tôi gặp phải các lỗi truy cập không đủ bằng cách sử dụng ldap_modify với OpenLDAP 2.4.32 và PHP 5.4.6.PHP ldap_modify Không đủ quyền truy cập

Chức năng php mà là cho các lỗi như sau:

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

Các $ dn là đầy đủ các DN của người sử dụng cố gắng để thay đổi thông tin của họ cùng với mật khẩu của họ. Và $ data là các giá trị mà chúng đang cập nhật, ngay bây giờ dữ liệu chỉ chứa số điện thoại để thay đổi $ data ['mobile'] = "newPhoneNumber". Điều này tất cả dường như được làm việc ngoại trừ thực tế các dữ liệu không bao giờ thực sự được viết.

Tệp openldap được bao gồm bên dưới vì bạn có thể thấy ACL nói rằng tôi có thể ghi vào đó.

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 

Câu hỏi đặt ra là tại sao PHP không thể cập nhật giá trị và thay vào đó nhận được lỗi truy cập không đủ?

+0

Trước khi cuộc gọi của bạn để ldap_connect(), hãy thử 'ldap_set_option (NULL, LDAP_OPT_DEBUG_LEVEL, 7); 'mà sẽ đổ một loạt các kết xuất debug để Apache log lỗi toàn cầu (nó _will not_ đổ vào một vhost cụ thể đăng nhập hoặc vào cài đặt 'error_log' của bạn.) – miken32

Trả lời

2

Để gỡ lỗi sự cố của bạn, tôi khuyên bạn nên sử dụng công cụ dòng lệnh ldapmodify để thực hiện yêu cầu tương tự. Bạn có thể cần phải cài đặt nó vào hệ thống của bạn (Redhat openldap-clients, Debian slapd).

LDAP Utilities

Bằng cách đặt mức độ gỡ lỗi -d bạn hy vọng có thể nhận được nhiều thông tin hơn những gì các thư viện php đang cung cấp về việc tại sao cuộc gọi của bạn đang trở lại các lỗi truy cập đầy đủ.

Trong khi tôi chưa bao giờ phải làm điều này với ldapmodify, tôi đã sử dụng nó với ldapsearch với thành công rực rỡ. Vì vậy, nó có thể mất một số tìm kiếm hoặc ldapmodify --help để tìm ra cách sử dụng nó.

Tôi tưởng tượng lệnh sẽ giống như thế này:

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

tôi phải vật lộn với một vài điều trong khi thay đổi mật khẩu Active Directory. Có thể điều này cũng sẽ giúp những người khác:

Thứ nhất: Bạn sẽ cần kết nối an toàn nếu không LDAP sẽ từ chối thay đổi mật khẩu.

$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: Trên hệ thống của tôi, tôi đã có vấn đề bắt đầu kết nối an toàn, tôi giải quyết này cho bây giờ chỉnh sửa /etc/ldap/ldap.conf

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

3rd: Đối với hoạt động thư mục chúng tôi sử dụng unicodePwd trường thay vì trường userPassword. Trường này yêu cầu một chuỗi trong Unicode.

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

4: Để thay đổi mật khẩu mà bạn không thể sử dụng modify thay vào đó bạn nên sử dụng chức năng mod_replace.

ldap_mod_replace($ldapConnection, $user_dn, $entry); 
Các vấn đề liên quan