$ _ SERVER ['REMOTE_USER']返回登录到Active Directory的用户的用户名。我想使用ldap_search()来检索此用户信息。
这就是我现在所拥有的:
$ad = // ldap_connection id
$filter = "(|(sn=$username*)(givenname=$username*))";
$attr = array("displayname", "mail", "mobile", "homephone", "telephonenumber", "streetaddress", "postalcode", "physicaldeliveryofficename", "l");
$dn = // OU, DC etc..
ldap_search($ad,$dn,$filter,$attr);
它有效,但我不确定如果两个用户具有几乎相同的名称它将起作用。 我如何仅搜索其唯一的用户名,以便我始终只获得一个用户?
答案 0 :(得分:4)
sAMAccountName
是Active Directory中使用的用户名属性,因此(&(objectClass=user)(sAMAccountName=%s))
将是检查LDAP是否为给定用户名的正确过滤器(%s
被实际用户名替换天然地)。
请注意,您需要处理$username
中的特殊字符,以避免格式错误的过滤器或最糟糕的恶意LDAP注入(请参阅 RFC 2254 ):
任何带有ACII的控制字符 代码< 32以及人物 在LDAP过滤器中具有特殊含义 “*”,“(”,“)”和“\”(反斜杠) 转换为表示 反斜杠后跟两个十六进制 表示十六进制的数字 角色的价值。
答案 1 :(得分:3)
ldap_search()
将找到所有匹配的条目,您必须验证结果。
假设$link
是您使用ldap_connect()
创建的LDAP数据库的链接ldap_get_entries($ link,$ result)
您可以像这样验证:
$result = ldap_search();
if(ldap_count_entries($link, $result) === 1) {
...
}
或
$result = ldap_search();
$entries = ldap_get_entries($link, $result);
if(sizeof($entries) === 1) {
...
}
答案 2 :(得分:0)
ldap_search同时支持&和和或|。如果要搜索多个属性以查找搜索字符串,可以按以下步骤进行。这将搜索一个人,其中您的搜索字符串($ str)以samaccountname或名称或标题开头。
$filter="(&(objectClass=user)(objectCategory=person)(|(sAMAccountName=*{$str}*)(name=*{$str}*)(title=*{$str}*)))";
$result=ldap_search($connection, $dn, $filter);