PHP LDAP 搜索问题
PHP LDAP search issue
我第一次尝试在某些 PHP 代码中使用 LDAP。我想确定某人是否是特定广告组的成员。
我从其他示例中拼凑了一些代码并且运行时没有错误,但当用户实际上是该组的成员时却显示 0 个结果。
这是我的代码:
$hostname="192.168.1.1";
$conn=ldap_connect($hostname, 389);
ldap_set_option ($conn, LDAP_OPT_REFERRALS, 0) or die('Unable to set LDAP opt referrals');
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');
if ($conn) {
$dn = "DC=domain,DC=local";
// if (!($ldapc=ldap_bind($conn,'CN=Username,CN=Users,DC=domain,DC=local','P@ssw0rd'))) {
if (!($ldapc=ldap_bind($conn,'username@domain.local','N0tMyP@ssw0rd'))) {
这里是完整的 CN=、DC= 等还是 @domain.local 是首选方法?
此外,我假设为会员资格执行的所有搜索都将针对由 ldap_bind()?
验证的用户
代码继续:
echo "<p>Error:" . ldap_error($conn) . "</p>";
echo "<p>Error number:" . ldap_errno($conn) . "</p>";
echo "<p>Error:" . ldap_err2str(ldap_errno($conn)) . "</p>";
die;
}
$attributes = array("memberOf");
$filter = "(memberOf=myGroup,OU=Application Security,DC=domain,DC=local)";
$result = ldap_search($conn, $dn, $filter, $attributes);
echo $result."<BR />";
$info = ldap_get_entries($conn, $result);
echo $info["count"]." entries returned.\n";
for ($i=0; $i < $info["count"]; $i++) {
echo $info[$i]["ou"][0];
}
} else {
echo "<h4>Unable to connect to LDAP server</h4>";
}
ldap_unbind($conn);
编辑:
根据以下建议,我能够按预期进行工作。这是那些将受益的人的最终工作代码...
$hostname="192.168.1.1";
$conn=ldap_connect($hostname, 389);
ldap_set_option ($conn, LDAP_OPT_REFERRALS, 0) or die('Unable to set LDAP opt referrals');
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');
if ($conn) {
$dn = "DC=domain,DC=local";
if (!($ldapc=ldap_bind($conn,'CN=Administrator,CN=Users,DC=domain,DC=local','password'))) {
echo "<p>Error:" . ldap_error($conn) . "</p>";
echo "<p>Error number:" . ldap_errno($conn) . "</p>";
echo "<p>Error:" . ldap_err2str(ldap_errno($conn)) . "</p>";
die;
}
$filter = "(memberOf=cn=Dashboard,OU=Application Security,DC=domain,DC=LOCAL)";
$result = ldap_search($conn, $dn, $filter);
// $attributes = array('samaccountname');
//$result = ldap_search($conn, $dn, $filter, $attributes);
$info = ldap_get_entries($conn, $result);
echo $info["count"]." entries returned.<br />";
for ($i=0; $i < $info["count"]; $i++) {
echo $i . " " . $info[$i]["samaccountname"][0] . "<br />";
}
} else {
echo "<h4>Unable to connect to LDAP server</h4>";
}
ldap_unbind($conn);
我个人更喜欢 cn=...
绑定目录的方式,因为它是通用的。 username@domain
-版本仅适用于 AD。
并且绑定到目录的用户不是您正在查找组 for 的用户,而是您正在查找信息 with.
因此,当您绑定到 LDAP 服务器的用户无权查看组信息时,您的运气就不会好。另一方面,如果您需要使用正在查找组成员身份的用户登录,则只有在知道用户密码时才能检索组成员身份。这会有点奇怪,不是吗?
并且由于绑定到 LDAP-Server 的用户通常只需要对 LDAP-Server 具有读取权限,因此可以使用 匿名绑定 而无需要绑定的真实用户。然后,您只需省略 ldap_bind
上的用户和密码字段。但这取决于服务器的设置。
要获得您的查询 return 的结果数量,您还可以使用 ldap_count_entries($connectionHandle, $resultHandle)
函数,但我认为您的搜索过滤器存在问题。
搜索过滤器必须包含一个查询。在您的情况下,您只需提供一个字符串,但不会告诉 LDAP-Server which 字段将其映射到。过滤器总是看起来像这样:<fieldname>=<querystring>
。所以在你的情况下是 memberOf=cn=mygroup,OU=Application Security,DC=domain,DC=local
。不同之处在于该组由其完整的 DN 标识(我在这里假设)是 cn=mygroup,OU=Application Security,DC=domain,DC=local
- 你必须验证它!
该查询将 return 您 所有 属于该角色的用户。它只会 return 你的 memberOf
- 你已经知道的那些用户的属性。因此,您应该将 $attributes
留空或使用 ['cn', 'sAMAcountName', 'mail']
之类的内容来获取 CN、用户 ID 和电子邮件地址 returned。
在第二步中,您将必须检查您要查找的用户是否确实在该 returned 数组中。
或者您可以只搜索用户(过滤器类似于 mail=<email-address>
或 sAMAcountName=<user-ID>
并获得 memberOf
值 returned。然后您将拥有查看所需的组是否是 memberOf
-Entry.
中的组之一
害怕吗?没看懂?不用担心。问!
我第一次尝试在某些 PHP 代码中使用 LDAP。我想确定某人是否是特定广告组的成员。
我从其他示例中拼凑了一些代码并且运行时没有错误,但当用户实际上是该组的成员时却显示 0 个结果。
这是我的代码:
$hostname="192.168.1.1";
$conn=ldap_connect($hostname, 389);
ldap_set_option ($conn, LDAP_OPT_REFERRALS, 0) or die('Unable to set LDAP opt referrals');
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');
if ($conn) {
$dn = "DC=domain,DC=local";
// if (!($ldapc=ldap_bind($conn,'CN=Username,CN=Users,DC=domain,DC=local','P@ssw0rd'))) {
if (!($ldapc=ldap_bind($conn,'username@domain.local','N0tMyP@ssw0rd'))) {
这里是完整的 CN=、DC= 等还是 @domain.local 是首选方法?
此外,我假设为会员资格执行的所有搜索都将针对由 ldap_bind()?
验证的用户代码继续:
echo "<p>Error:" . ldap_error($conn) . "</p>";
echo "<p>Error number:" . ldap_errno($conn) . "</p>";
echo "<p>Error:" . ldap_err2str(ldap_errno($conn)) . "</p>";
die;
}
$attributes = array("memberOf");
$filter = "(memberOf=myGroup,OU=Application Security,DC=domain,DC=local)";
$result = ldap_search($conn, $dn, $filter, $attributes);
echo $result."<BR />";
$info = ldap_get_entries($conn, $result);
echo $info["count"]." entries returned.\n";
for ($i=0; $i < $info["count"]; $i++) {
echo $info[$i]["ou"][0];
}
} else {
echo "<h4>Unable to connect to LDAP server</h4>";
}
ldap_unbind($conn);
编辑: 根据以下建议,我能够按预期进行工作。这是那些将受益的人的最终工作代码...
$hostname="192.168.1.1";
$conn=ldap_connect($hostname, 389);
ldap_set_option ($conn, LDAP_OPT_REFERRALS, 0) or die('Unable to set LDAP opt referrals');
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');
if ($conn) {
$dn = "DC=domain,DC=local";
if (!($ldapc=ldap_bind($conn,'CN=Administrator,CN=Users,DC=domain,DC=local','password'))) {
echo "<p>Error:" . ldap_error($conn) . "</p>";
echo "<p>Error number:" . ldap_errno($conn) . "</p>";
echo "<p>Error:" . ldap_err2str(ldap_errno($conn)) . "</p>";
die;
}
$filter = "(memberOf=cn=Dashboard,OU=Application Security,DC=domain,DC=LOCAL)";
$result = ldap_search($conn, $dn, $filter);
// $attributes = array('samaccountname');
//$result = ldap_search($conn, $dn, $filter, $attributes);
$info = ldap_get_entries($conn, $result);
echo $info["count"]." entries returned.<br />";
for ($i=0; $i < $info["count"]; $i++) {
echo $i . " " . $info[$i]["samaccountname"][0] . "<br />";
}
} else {
echo "<h4>Unable to connect to LDAP server</h4>";
}
ldap_unbind($conn);
我个人更喜欢 cn=...
绑定目录的方式,因为它是通用的。 username@domain
-版本仅适用于 AD。
并且绑定到目录的用户不是您正在查找组 for 的用户,而是您正在查找信息 with.
因此,当您绑定到 LDAP 服务器的用户无权查看组信息时,您的运气就不会好。另一方面,如果您需要使用正在查找组成员身份的用户登录,则只有在知道用户密码时才能检索组成员身份。这会有点奇怪,不是吗?
并且由于绑定到 LDAP-Server 的用户通常只需要对 LDAP-Server 具有读取权限,因此可以使用 匿名绑定 而无需要绑定的真实用户。然后,您只需省略 ldap_bind
上的用户和密码字段。但这取决于服务器的设置。
要获得您的查询 return 的结果数量,您还可以使用 ldap_count_entries($connectionHandle, $resultHandle)
函数,但我认为您的搜索过滤器存在问题。
搜索过滤器必须包含一个查询。在您的情况下,您只需提供一个字符串,但不会告诉 LDAP-Server which 字段将其映射到。过滤器总是看起来像这样:<fieldname>=<querystring>
。所以在你的情况下是 memberOf=cn=mygroup,OU=Application Security,DC=domain,DC=local
。不同之处在于该组由其完整的 DN 标识(我在这里假设)是 cn=mygroup,OU=Application Security,DC=domain,DC=local
- 你必须验证它!
该查询将 return 您 所有 属于该角色的用户。它只会 return 你的 memberOf
- 你已经知道的那些用户的属性。因此,您应该将 $attributes
留空或使用 ['cn', 'sAMAcountName', 'mail']
之类的内容来获取 CN、用户 ID 和电子邮件地址 returned。
在第二步中,您将必须检查您要查找的用户是否确实在该 returned 数组中。
或者您可以只搜索用户(过滤器类似于 mail=<email-address>
或 sAMAcountName=<user-ID>
并获得 memberOf
值 returned。然后您将拥有查看所需的组是否是 memberOf
-Entry.
害怕吗?没看懂?不用担心。问!