我正在努力完成与用户正在做的事情Here非常相似的事情。
我按照了答案,但我无法正常工作。在Active目录中,我的memberOf字段如下所示:
CN=$VPN Users,CN=Users,DC=iai,DC=pri,CN=$ITAR,CN=Users,DC=iai,DC=pri,CN=allsubscribers,CN=Users,DC=iai,DC=pri
我的过滤器有效:
(&(objectCategory=person)(sAMAccountName=$p_username))
我正在努力让以下工作:
(&(objectCategory=person)(sAMAccountName=$p_username)(memberOf=CN=$ITAR))
我尝试添加完整的DN CN =用户,DC = IAI,DC = PRI 到我的过滤器,但我得到:
array(1) { ["count"]=> int(0) }
作为我的回复。
我正在使用ldap 3
这是用php编写的部分工作身份验证代码:
$login = ldap_bind( $url, "username@somedomain", $password );
$attributes = array("displayname", "mailnickname");
$filter = "(&(objectCategory=person)(sAMAccountName=$username))";
$result = ldap_search($url, "CN=Users,DC=iai,DC=pri", $filter, $attributes);
$entries = ldap_get_entries($url, $result);
我做错了什么?
First Var dump:
string(49) "(&(objectCategory=person)(sAMAccountName=rmoser))"
array(2) {
["count"] => int(1)
[0] => array(8) {
["displayname"] => array(2) {
["count"] => int(1)
[0] => string(10) "Ryan Moser"
}
[0] => string(11) "displayname"
["memberof"] => array(4) {
["count"] => int(3)
[0] => string(36) "CN=$VPN Users,CN=Users,DC=iai,DC=pri"
[1] => string(31) "CN=$ITAR,CN=Users,DC=iai,DC=pri"
[2] => string(40) "CN=allsubscribers,CN=Users,DC=iai,DC=pri"
}
[1]=> string(8) "memberof"
["mailnickname"] => array(2) {
["count"] => int(1)
[0] => string(6) "rmoser"
}
[2] => string(12) "mailnickname"
["count"] => int(3)
["dn"] => string(36) "CN=Ryan Moser,CN=Users,DC=iai,DC=pri"
}
}
bool(false)
第二个var_dump:
string(70) "(&(objectCategory=person)(sAMAccountName=rmoser)(memberof=*CN=$ITAR*))"
array(1) {
["count"] => int(0)
}
答案 0 :(得分:0)
LDAP过滤器会查找完全匹配。
为了在值中的任意位置匹配CN=$ITAR
,您需要使用过滤器通配符*
将其包围。
试试这个过滤器:
(&(objectCategory=person)(sAMAccountName=$p_username)(memberOf=*CN=$ITAR*))
另外请不要忘记$ITAR
是PHP中的有效变量名,因此如果您将该过滤字符串放在双引号中(您需要插入$p_username
) PHP将尝试将$ITAR
插入为变量,发现它(可能)不存在,最终结果将是它从字符串中被剥离。
$filter = "(&(objectCategory=person)(sAMAccountName=$p_username)(memberOf=*CN=\$ITAR*))";
有关使用PHP构建的动态过滤器的任何问题的有用链接是this。