2012-10-25 12 views
7

OpenLDAP 2.4.32およびPHP 5.4.6でldap_modifyを使用してアクセスエラーが不十分です。エラーを与えているPHP ldap_modifyアクセスが不十分です

PHP関数は次のようになります。

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は自分のパスワードと一緒に自分の情報を変更しようとしているユーザーの完全なDNです。 $ dataは更新中の値です。現在、データには$ data ['mobile'] = "newPhoneNumber"を変更するための電話番号が含まれています。これは、データが実際には決して書き込まれないという事実を除いて、すべて機能しているように見えます。

ACLに書き込むことができるとわかるように、openldapファイルが以下に含まれています。

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 

なぜPHPは値を更新できず、代わりに不十分なアクセスエラーが発生していますか?

+0

)、 'たldap_set_optionしてみてください(NULL、LDAP_OPT_DEBUG_LEVELは、7);'(これはバーチャルホスト固有にダンプNOT_ARCHIVEDの_will Apacheのグローバルエラーログにデバッグ出力の束をダンプしますログ、または 'error_log'設定に変更します)。 – miken32

答えて

2

問題をデバッグするには、コマンドラインツールldapmodifyを使用して同じ要求を行うことをお勧めします。システムにインストールする必要があります(Redhat openldap-clients、Debian slapd)。あなたがうまくいけば、PHPのライブラリはあなたの呼び出しが不十分アクセスエラーを返している理由について提供されているものよりも多くの情報を得ることができ-dデバッグレベルを設定することにより

LDAP Utilities

私はのldapmodify でこれを行うにはありませんでしたが、私は大きな成功を収めのldapsearchとそれを使用しています。だから、それを使用する方法を見つけるためにいくつかの検索やldapmodify --helpがかかる場合があります。私は、Active Directoryのパスワードを変更しながら、いくつかのことに苦労し

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

私は、コマンドは次のようになります想像してみてください。

第1回:安全な接続が必要です。そうしないと、LDAPはパスワードの変更を拒否します。

$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); 

第二:私のシステムでは、私は安全な接続を開始する問題を抱えていた、私は今

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

第三の/etc/ldap/ldap.conf編集のためにこれを解決します。Active Directoryのために我々はunicodePwdを使用しましたフィールドの代わりにuserPasswordフィールドを使用します。このフィールドには、UnicodeのStringが必要です。

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

第4回:パスワードを変更するために、あなたがmod_replace機能を使用する必要があります代わりにmodifyを使用することはできません。 (ldap_connectためにあなたの呼び出しの前に

ldap_mod_replace($ldapConnection, $user_dn, $entry); 
関連する問題