一般程序是(括号中的相关ext/ldap php命令):
连接到使用"LDAP主机"和"LDAP端口号" LDAP服务器(ldap_connect() ),并设置正确的连接选项(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框架.我没有实际使用的经验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) { // something failed - inspect $e } // bind successful $acctname = $ldap->getCanonicalAccountName('user', Zend_Ldap::ACCTNAME_FORM_DN);