7

在 OpenLDAP 2.4.32 和 PHP 5.4.6 中使用 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 只包含要更改的电话号码 $data['mobile'] = "newPhoneNumber"。除了数据从未实际写入之外,这一切似乎都在工作。

openldap 文件包含在下面,您可以看到 ACL 说我应该能够写入它。

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 不能更新值,而是得到一个访问不足的错误?

4

2 回答 2

2

要调试您的问题,我建议使用命令行工具ldapmodify发出相同的请求。您可能需要将它安装到您的系统(Redhat openldap-clients,Debian slapd)。

LDAP 实用程序

通过设置调试级别-d,您有望获得比 php 库提供的有关您的调用返回访问不足错误的原因的更多信息。

虽然我从来不用ldapmodify来做这件事,但我已经将它与ldapsearch一起使用并取得了巨大的成功。所以可能需要一些搜索或ldapmodify --help弄清楚如何使用它。

我想命令看起来像这样:

ldapmodify -d 7 -h ldap.server.com -D bind_dn -w bind_password -f /tmp/entrymods
于 2016-04-21T18:03:59.893 回答
0

我在更改 Active Directory 密码时遇到了一些问题。也许这也会对其他人有所帮助:

第一:您将需要一个安全连接,否则 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);

第二:在我的系统上,我在启动安全连接时遇到了问题,我现在解决了这个问题,编辑 /etc/ldap/ldap.conf

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

第三:对于活动目录,我们使用unicodePwd字段而不是userPassword字段。此字段需要 Unicode 字符串。

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

第四:更改密码不能使用modify,而是使用mod_replace函数。

ldap_mod_replace($ldapConnection, $user_dn, $entry);
于 2016-04-22T09:34:11.180 回答