PHP - ldap_search()过滤器。如何搜索用户

时间:2010-05-28 07:25:06

标签: php active-directory filter ldap

$ _ 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);

它有效,但我不确定如果两个用户具有几乎相同的名称它将起作用。 我如何仅搜索其唯一的用户名,以便我始终只获得一个用户?

3 个答案:

答案 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);