[英]Search users in more OUs in LDAP with PHP
我的任务是使用存储在其工作机器中的AD凭证,最终实现单点登录解决方案以将用户登录到我的系统。 我在PHP中使用ldap_
函数 。
我遇到的问题是我必须检查多个OU的凭据(目前大约30个),而且我还没有找到从AD系统获取这些OU的方法,所以我有大量的OU作为一种权宜之计。 我用ADexplorer获得了这个列表。 有没有办法用PHP做到这一点?
我的第一语言不是英语,所以我让阿德里亚诺为我翻译这个,我在理解文档方面也遇到了问题。
在这个阶段,我基本上是从ldap_search联机帮助页中的示例复制此代码:
<?php
$ds=ldap_connect($ldapserver);
// 42 OUs in our case
$dn[]='OU=ABC,DC=xyz,DC=ac,DC=uk';
$dn[]='OU=DEF,DC=xyz,DC=ac,DC=uk';
// ...
$totalDns = count($dn);
for ($i = 0; $i < $totalDns; $i++) {
$id[] = $ds;
}
$filter = 'samaccountname='.$_POST['username'];
$result = ldap_search($id,$dn,$filter);
$search = false;
foreach ($result as $value) {
if(ldap_count_entries($ds,$value)>0){
$search = $value;
break;
}
}
if($search){
$info = ldap_get_entries($ds, $search);
}else{
$info = 'No results found';
}
更新
我尝试了Vladislav Ross建议的解决方案,几秒钟后,服务器吐了这个:
mod_fcgid: stderr: PHP Warning: ldap_search() [<a href='function.ldap-search'>function.ldap-search</a>]: Search: Can't contact LDAP server in ... on line 28
如果我将特定OU添加到同一搜索中,则不会发生这种情况。 IE,如果我这样做
$sr = ldap_search(
$ds,
"OU=Usuarios,dc=test,dc=com",
"ObjectClass=organizationalUnit",
array("")
);
代替
$sr = ldap_search(
$ds,
"dc=test,dc=com",
"ObjectClass=organizationalUnit",
array("")
);
我得到了正确的结果。 我尝试将timelimit和sizelimit参数设置为0,但结果相同。 我现在正在咨询服务器人员,了解他们的限制是什么。
尝试将ldap_search与过滤器ObjectClass = organizationalUnit一起使用:
$ds = ldap_connect($AD_server);
if(!$ds) die("cannot connect to LDAP server at $AD_server.");
$r = ldap_bind($ds, $AD_Auth_User, $AD_Auth_PWD);
if(!$r)
{
ldap_get_option($ds,LDAP_OPT_ERROR_STRING,$error);
die("cannot bind to LDAP server at $AD_server ($error).");
};
$sr=ldap_search($ds,"dc=test,dc=com","ObjectClass=organizationalUnit",array(""));
$info = ldap_get_entries($ds, $sr);
print_r($info); //<--array with OU's you need
如果您不需要递归搜索,请使用ldap_list而不是ldap_search。
听起来您想要对域中的任何用户进行身份验证。 不要搜索多个DN,只需从域的根目录搜索一次。 因此,不使用'OU=ABC,DC=xyz,DC=ac,DC=uk'
,而是使用'DC=xyz,DC=ac,DC=uk'
。
我还没有找到从AD系统获取这些OU的方法
上面的例子表明这些OU是DC = xyz,DC = ac,DC = uk的直接子节点? 如果是这样,找到这些的最有效的LDAP搜索是:
使用相应的ldapsearch命令行进行测试......
ldapsearch -h <hostname> -s onelevel -b "DC=xyz,DC=ac,DC=uk" "(objectclass=organizationalUnit)"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.