我正在尝试第一次在某些PHP代码中使用LDAP。我想确定某人是否是特定AD小组的成员。
我拼凑了其他示例中的一些代码,这样运行没有错误,但是当用户实际上是该组的成员时,表示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);
答案 0 :(得分:0)
我个人更喜欢cn=...
方式绑定到目录,因为它是通用的。 username@domain
- 版仅适用于AD。
绑定到该目录的用户不是您正在查找 组的用户,而是您正在查找 信息的用户。
因此,当您绑定到LDAP-Server的用户无权查看组信息时,您将没有太多运气。另一方面,如果您需要向用户登录,那么您正在查找组成员身份,只有在您知道用户密码时才能检索组成员身份。 Taht会有点奇怪,不是吗?
由于绑定到LDAP-Server的用户只需具有LDAP服务器的读取权限,因此通常可以使用匿名绑定而无需真正的用户绑定。然后,您只需省略ldap_bind
上的用户和密码字段。但这取决于服务器的设置。
要获取查询返回的结果数量,您还可以使用ldap_count_entries($connectionHandle, $resultHandle)
- 函数,但我认为您的搜索过滤器存在问题。
搜索过滤器必须包含查询。在您的情况下,您只需提供一个字符串,但不要告诉LDAP-Server wwhich字段将其映射。过滤器总是看起来像这样:<fieldname>=<querystring>
。所以在你的情况下,memberOf=cn=mygroup,OU=Application Security,DC=domain,DC=local
。区别在于该组是由它的完整DN标识的(我假设在这里)是cn=mygroup,OU=Application Security,DC=domain,DC=local
- 你必须验证它!
该查询将返回属于该角色成员的所有用户。它只会返回memberOf
- 您已知道的那些用户的属性。因此,您应该将$attributes
留空或使用['cn', 'sAMAcountName', 'mail']
之类的内容来获取CN,用户ID和返回的电子邮件地址。
在第二步中,您必须检查您正在寻找的用户是否确实在该返回的数组中。
或者您只需搜索用户(过滤器类似于mail=<email-address>
或sAMAcountName=<user-ID>
并获得memberOf
值。然后您必须查看所需的组是否为memberOf
- 条目中的一个。
害怕吗?不明白吗?别担心。请教!