【问题标题】:PHP - ldap_search() filter. How to search for userPHP - ldap_search() 过滤器。如何搜索用户
【发布时间】:2010-05-28 07:25:06
【问题描述】:

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

它有效,但我不确定如果两个用户的名字几乎相同,它是否有效。 我如何只搜索他们唯一的用户名,这样我总是只能得到一个用户?

【问题讨论】:

  • $filter = "(samaccountname=$username)";

标签: php active-directory filter ldap


【解决方案1】:

sAMAccountName 是 Active Directory 中使用的用户名属性,因此(&(objectClass=user)(sAMAccountName=%s)) 将是检查给定用户名的 LDAP 的正确过滤器(%s 自然会替换为实际用户名)。

请注意,您需要处理 $username 中的特殊字符以避免格式错误的过滤器或最糟糕的恶意 LDAP 注入(请参阅 RFC 2254):

任何带有 ACII 的控制字符 代码

【讨论】:

    【解决方案2】:

    ldap_search() 将找到所有匹配的条目,您必须验证结果。 假设$link 是您使用ldap_connect()ldap_get_entries($link, $result) 创建的LDAP 数据库的链接 您可以像这样验证:

    $result = ldap_search();
    if(ldap_count_entries($link, $result) === 1) {
        ...
    }
    

    $result = ldap_search();
    $entries = ldap_get_entries($link, $result);
    if(sizeof($entries) === 1) {
        ...
    }
    

    【讨论】:

      【解决方案3】:

      ldap_search 支持 and & 和 or |。如果要搜索多个属性以查找搜索字符串的出现,可以按如下方式进行。这将在 samaccountname 或 name 或 title 中搜索您的搜索字符串 ($str) 所在的人。

      $filter="(&(objectClass=user)(objectCategory=person)(|(sAMAccountName=*{$str}*)(name=*{$str}*)(title=*{$str}*)))";
      
      $result=ldap_search($connection, $dn, $filter);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多