当前我正在尝试确定用户是否应该能够使用LDAP登录。我读过很多用PHP编写的LDAP连接,到目前为止,事情都在进行中,直到我想搜索用户是否属于某个组。
我当前必须连接到LDAP服务器的详细信息:
- DN:CN=PAY LDAP用户,OU=PAY,OU=Applications,OU=ITSpecials,DC=域,DC=be
- SAM:admin
- PWD:密码
- 搜索DN ADM:OU=OU GROUP,OU=AD,DC=domain,DC=be
- LDAP/GC服务器:knt-adm-dc1.domain.be,knt-adm-dc2.domain.be
不过这个代码没有给我返回任何结果:
if($bind = ldap_bind($ldap, $username, $password)) {
$filter = "(samaccountname=".$user.")";
$attr = array("memberof");
$result = ldap_search($ldap, $ldap_dn, $filter, $attr) or exit("Unable to search LDAP server");
$entries = ldap_get_entries($ldap, $result);
ldap_unbind($ldap);
}
当我从搜索中去掉$attr时,我确实得到了一个结果,尽管我似乎找不到确定该用户是否是ADMIN组的一部分的方法。
根据我在网上读到的内容,memberof属性应该用于查找用户是否是组的一部分。
两件事:
- 如果用户不是任何组的成员,则
memberOf
属性将不存在 - 内置组不会显示在
memberOf
属性中
一种更防失败的方法是使用一个有点模糊的LDAP过滤器来搜索您的组和任何嵌套的组以查找用户:LDAP_MATCHING_RULE_IN_CHAIN规则。详细信息请点击此处。
在PHP中,它看起来像这样(未经测试):
$filter = "(member:1.2.840.113556.1.4.1941:=".$user_distinguished_name.")";
$ldap_dn = "LDAP://".$group_distinguished_name;
$attr = array("cn");
$result = ldap_list($ldap, $ldap_dn, $filter, $attr);
其中,$user_distinguished_name
是用户的可分辨名称,$group_distinguished_name
是组的DN。你可能必须事先得到这些。
注意,我放的是ldap_list而不是ldap_search。两者之间唯一的区别是搜索范围。我认为ldap_search可能仍然有效,但不需要它。