一般的流程如下(相关的ext/ldap php命令在括号中):
使用"LDAP主机"和"LDAP端口号"(ldap_connect())连接到LDAP服务器,并设置正确的连接选项(ldap_set_option()),特别是LDAP_OPT_PROTOCOL_VERSION
和LDAP_OPT_REFERRALS
使用"绑定LDAP帐户"和"LDAP帐户密码"(ldap_bind())绑定到LDAP服务器 - 如果您要对Active Directory服务器进行身份验证,可以直接使用登录页面上的用户名和密码,跳过以下所有步骤。
通过指定"BASE DN"和适当的LDAP过滤器在树中搜索匹配的用户条目/对象 - 最有可能是类似于(&(objectClass=user)(sAMAccountName=%s))
的内容,其中%s
应该被要进行身份验证的用户名替换(ldap_search())
检查返回的条目数是否为1(如果不等于1,则出现了问题,例如找不到用户或找到多个用户)
检索此单个条目的区别名称(DN)(ldap_get_dn())
使用上一步中找到的DN尝试使用身份验证页面上提供的密码绑定到LDAP服务器(ldap_bind())
如果绑定成功,则一切正常;如果不成功,则密码很可能是错误的
这其实并不像听起来的那么难。一般来说,我建议使用一些标准库来对LDAP服务器进行身份验证,比如
Net_LDAP2
PEAR包或者
Zend_Ldap
来自
Zend Framework。我对使用
Net_LDAP2
没有实际经验(虽然我对代码非常熟悉),但
Zend_Ldap
在与Active Directory服务器或ADAMS服务器(显然这是你正在使用的)的通信方面表现得非常好。
以下是使用
Zend_Ldap
的解决方案:
$options = array(
'host' => 'ad.blueroom.ac.uk',
'useStartTls' => true,
'accountDomainName' => 'blueroom.ac.uk',
'accountCanonicalForm' => 4,
'baseDn' => 'ou=bluebird,dc=bluebird,dc=ac,dc=my',
);
$ldap = new Zend_Ldap($options);
try {
$ldap->bind('user', 'password');
} catch (Zend_Ldap_Exception $e) {
}
$acctname = $ldap->getCanonicalAccountName('user', Zend_Ldap::ACCTNAME_FORM_DN);