警告:ldap_add():添加:对象 class 违规
Warning: ldap_add(): Add: Object class violation
在过去的几天里,我一直在尝试了解有关 ldap 的更多信息,现在我希望能够通过网络表单在我的 phpldapadmin 服务器上创建一个新帐户。我的值通过 php 正确传回,但我一直收到 objectclass violation
错误。我搜索了许多不同的资源 (including this one),基本上我能找到的只是 objectclass
需要与字典的设置方式完全匹配。我 运行 为我已经在那里成功工作的一些手动创建的用户导出,这是输出示例:
# LDIF Export for cn=api user,cn=students,ou=users,dc=myhost,dc=com
# Server: LDAP (ip)
# Search Scope: sub
# Search Filter: (objectClass=*)
# Total Entries: 1
#
# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on June 4, 2016 3:15 pm
# Version: 1.2.2
version: 1
# Entry 1: cn=api user,cn=students,ou=users,dc=myhost,dc=co...
dn: cn=test user,cn=students,ou=users,dc=myhost,dc=com
cn: test
gidnumber: 502
givenname: test
homedirectory: /home/users/testuser
loginshell: /bin/sh
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: tuser
uid: testuser
uidnumber: 1003
userpassword: {MD5}pass==
并且我已经尝试在我的脚本(如下)中尽可能地模仿它,但我仍然遇到违规错误。连接或与任何其他字段没有问题,只有 objectclass
问题。
$ds = ldap_connect($AD_server);
if ($ds) {
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
$r = ldap_bind($ds, $AD_Auth_User, $AD_Auth_PWD);
$info["cn"] = $user_full_name;
$info["sn"] = $user_username;
$info['objectclass'][0] = "top";
$info['objectclass'][1] = "posixAccount";
$info['objectclass'][2] = "inetOrgPerson";
$info['uid'] = $user_username;
$info['userpassword'] = $newPassw;
$info['loginshell'] = '/bin/sh';
$info['homedirectory'] = "/home/users/$user_username";
// add data to directory
$r = ldap_add($ds, $dn, $info);
ldap_close($ds);
} else {
echo "Unable to connect to LDAP server";
}
我试过对象类并尝试切换它们的位置或仅使用 inetOrgPerson
,但仍然没有成功。有什么想法吗?
看来您需要确保将每个值 传回。我缺少 uidnumber
givenname
和 gidnumber
字段。但现在可以了! :)
在 LDAP 中创建条目时,您需要知道创建条目时使用的 ObjectClass 的哪些属性 "MUST"(必需)。
在你的例子中:
人必须 ( sn $ cn )
posixAccount 必须 (cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
因此,要在 LDAP 中创建条目,您必须具有所有这些值:
- sn
- cn
- uid
- uid 编号
- gid 编号
- 主目录
您可以通过 LDAP Query For Schema 判断哪些是必需的,并读取每个 ObjectClass 以确定哪些属性是 "MUST"(必需)。
在过去的几天里,我一直在尝试了解有关 ldap 的更多信息,现在我希望能够通过网络表单在我的 phpldapadmin 服务器上创建一个新帐户。我的值通过 php 正确传回,但我一直收到 objectclass violation
错误。我搜索了许多不同的资源 (including this one),基本上我能找到的只是 objectclass
需要与字典的设置方式完全匹配。我 运行 为我已经在那里成功工作的一些手动创建的用户导出,这是输出示例:
# LDIF Export for cn=api user,cn=students,ou=users,dc=myhost,dc=com
# Server: LDAP (ip)
# Search Scope: sub
# Search Filter: (objectClass=*)
# Total Entries: 1
#
# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on June 4, 2016 3:15 pm
# Version: 1.2.2
version: 1
# Entry 1: cn=api user,cn=students,ou=users,dc=myhost,dc=co...
dn: cn=test user,cn=students,ou=users,dc=myhost,dc=com
cn: test
gidnumber: 502
givenname: test
homedirectory: /home/users/testuser
loginshell: /bin/sh
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: tuser
uid: testuser
uidnumber: 1003
userpassword: {MD5}pass==
并且我已经尝试在我的脚本(如下)中尽可能地模仿它,但我仍然遇到违规错误。连接或与任何其他字段没有问题,只有 objectclass
问题。
$ds = ldap_connect($AD_server);
if ($ds) {
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
$r = ldap_bind($ds, $AD_Auth_User, $AD_Auth_PWD);
$info["cn"] = $user_full_name;
$info["sn"] = $user_username;
$info['objectclass'][0] = "top";
$info['objectclass'][1] = "posixAccount";
$info['objectclass'][2] = "inetOrgPerson";
$info['uid'] = $user_username;
$info['userpassword'] = $newPassw;
$info['loginshell'] = '/bin/sh';
$info['homedirectory'] = "/home/users/$user_username";
// add data to directory
$r = ldap_add($ds, $dn, $info);
ldap_close($ds);
} else {
echo "Unable to connect to LDAP server";
}
我试过对象类并尝试切换它们的位置或仅使用 inetOrgPerson
,但仍然没有成功。有什么想法吗?
看来您需要确保将每个值 传回。我缺少 uidnumber
givenname
和 gidnumber
字段。但现在可以了! :)
在 LDAP 中创建条目时,您需要知道创建条目时使用的 ObjectClass 的哪些属性 "MUST"(必需)。
在你的例子中: 人必须 ( sn $ cn ) posixAccount 必须 (cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
因此,要在 LDAP 中创建条目,您必须具有所有这些值:
- sn
- cn
- uid
- uid 编号
- gid 编号
- 主目录
您可以通过 LDAP Query For Schema 判断哪些是必需的,并读取每个 ObjectClass 以确定哪些属性是 "MUST"(必需)。