PHP LDAP搜索问题

时间:2015-04-14 22:23:40

标签: php ldap

我正在尝试第一次在某些PHP代码中使用LDAP。我想确定某人是否是特定AD小组的成员。

我拼凑了其他示例中的一些代码,这样运行没有错误,但是当用户实际上是该组的成员时,表示0结果。

这是我的代码:

$hostname="192.168.1.1";
$conn=ldap_connect($hostname, 389);
ldap_set_option ($conn, LDAP_OPT_REFERRALS, 0) or die('Unable to set LDAP opt referrals');
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');

if ($conn) {
    $dn = "DC=domain,DC=local";

    // if (!($ldapc=ldap_bind($conn,'CN=Username,CN=Users,DC=domain,DC=local','P@ssw0rd'))) { 
    if (!($ldapc=ldap_bind($conn,'username@domain.local','N0tMyP@ssw0rd'))) { 

完整的CN =,DC =等或@ domain.local是首选方法吗?

另外,我假设为会员资格执行的所有搜索都是针对ldap_bind()验证的用户?

代码继续:

    echo "<p>Error:" . ldap_error($conn) . "</p>"; 
    echo "<p>Error number:" . ldap_errno($conn) . "</p>"; 
    echo "<p>Error:" . ldap_err2str(ldap_errno($conn)) . "</p>"; 
    die;
    } 

    $attributes = array("memberOf");
    $filter = "(memberOf=myGroup,OU=Application Security,DC=domain,DC=local)";
    $result = ldap_search($conn, $dn, $filter, $attributes);

    echo $result."<BR />";
    $info = ldap_get_entries($conn, $result);
    echo $info["count"]." entries returned.\n";

    for ($i=0; $i < $info["count"]; $i++) {
        echo $info[$i]["ou"][0];
    }
} else {
    echo "<h4>Unable to connect to LDAP server</h4>";
}

ldap_unbind($conn);

编辑: 根据以下建议,我能够按预期工作。以下是那些受益的人的最终工作代码......

$hostname="192.168.1.1";
$conn=ldap_connect($hostname, 389);
ldap_set_option ($conn, LDAP_OPT_REFERRALS, 0) or die('Unable to set LDAP opt referrals');
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');
if ($conn) {
    $dn = "DC=domain,DC=local";
    if (!($ldapc=ldap_bind($conn,'CN=Administrator,CN=Users,DC=domain,DC=local','password'))) { 
        echo "<p>Error:" . ldap_error($conn) . "</p>"; 
        echo "<p>Error number:" . ldap_errno($conn) . "</p>"; 
        echo "<p>Error:" . ldap_err2str(ldap_errno($conn)) . "</p>"; 
        die;
    } 

    $filter = "(memberOf=cn=Dashboard,OU=Application Security,DC=domain,DC=LOCAL)";
    $result = ldap_search($conn, $dn, $filter);
    // $attributes = array('samaccountname');
    //$result = ldap_search($conn, $dn, $filter, $attributes);
    $info = ldap_get_entries($conn, $result);
    echo $info["count"]." entries returned.<br />";
    for ($i=0; $i < $info["count"]; $i++) {
        echo $i . " " . $info[$i]["samaccountname"][0] . "<br />";
    }
} else {
    echo "<h4>Unable to connect to LDAP server</h4>";
}
ldap_unbind($conn);

1 个答案:

答案 0 :(得分:0)

我个人更喜欢cn=...方式绑定到目录,因为它是通用的。 username@domain - 版仅适用于AD。

绑定到该目录的用户不是您正在查找 组的用户,而是您正在查找 信息的用户。

因此,当您绑定到LDAP-Server的用户无权查看组信息时,您将没有太多运气。另一方面,如果您需要向用户登录,那么您正在查找组成员身份,只有在您知道用户密码时才能检索组成员身份。 Taht会有点奇怪,不是吗?

由于绑定到LDAP-Server的用户只需具有LDAP服务器的读取权限,因此通常可以使用匿名绑定而无需真正的用户绑定。然后,您只需省略ldap_bind上的用户和密码字段。但这取决于服务器的设置。

要获取查询返回的结果数量,您还可以使用ldap_count_entries($connectionHandle, $resultHandle) - 函数,但我认为您的搜索过滤器存在问题。

搜索过滤器必须包含查询。在您的情况下,您只需提供一个字符串,但不要告诉LDAP-Server wwhich字段将其映射。过滤器总是看起来像这样:<fieldname>=<querystring>。所以在你的情况下,memberOf=cn=mygroup,OU=Application Security,DC=domain,DC=local。区别在于该组是由它的完整DN标识的(我假设在这里)是cn=mygroup,OU=Application Security,DC=domain,DC=local - 你必须验证它!

该查询将返回属于该角色成员的所有用户。它只会返回memberOf - 您已知道的那些用户的属性。因此,您应该将$attributes留空或使用['cn', 'sAMAcountName', 'mail']之类的内容来获取CN,用户ID和返回的电子邮件地址。

在第二步中,您必须检查您正在寻找的用户是否确实在该返回的数组中。

或者您只需搜索用户(过滤器类似于mail=<email-address>sAMAcountName=<user-ID>并获得memberOf值。然后您必须查看所需的组是否为memberOf - 条目中的一个。

害怕吗?不明白吗?别担心。请教!