我的任务最终是实施单点登录解决方案,使用存储在他工作机器中的 AD 凭据将用户登录到我的系统。我正在使用ldap_
PHP 中的函数。
我遇到的问题是我必须针对多个 OU(目前大约 30 个)检查凭据,而且我还没有找到从 AD 系统获取这些 OU 的方法,所以我有一大堆 OU作为权宜之计。我通过 ADexplorer 获得了这份清单。有没有办法用 PHP 做到这一点?
我的第一语言不是英语,所以我让 Adriano 为我翻译这个,而且我在理解文档时也遇到了问题。
在这个阶段,我基本上是从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,但结果相同。我现在正在咨询服务器人员,看看他们的限制是什么。