使用来自PHP的LDAP对用户进行身份validation

我的项目是为我们的大学做一个模块注册系统。 所以我联系了我大学的IT人员了解详细情况,以便让学生进入系统。 我们正在使用现有的大学login来开发系统。 他们给了我一些LDAP信息,我不知道那个用法。 我在Apacha服务器上使用PHP,Mysql。 我如何validation用户login到我的系统,给他的用户名和密码与LDAP信息。

下面给出的是LDAP信息(我已经改变了域名等)

blueroom.ac.uk域的LDAP信息


LDAP Host : ad.blueroom.ac.uk LDAP port no: 389 BASE DN : ou=bluebird, dc=bluebird, dc=ac, dc=my LDAP account to bind : cn = kikdap, ou=servacc, dc=bluebird,dc=ac,dc=uk LDAP account password : ******** Attribute : sAMAccountName 

一般的程序是(括号里的相关的ext / ldap php命令):

  1. 使用“LDAP主机”和“LDAP端口号”( ldap_connect() )连接到LDAP服务器,并设置正确的连接选项( ldap_set_option() ),尤其是LDAP_OPT_PROTOCOL_VERSIONLDAP_OPT_REFERRALS

  2. 使用“LDAP帐户绑定”和“LDAP帐户密码”( ldap_bind() )绑定到LDAP服务器 – 如果您是通过Active Directory服务器进行身份validation,则可以直接使用login页面中的用户名和密码,以下步骤。

  3. (&(objectClass=user)(sAMAccountName=%s)) ,其中%s应该被用户名replace,通过指定“BASE DN”和适当的LDAPfilter来search匹配的用户条目/被authentication( ldap_search() )

  4. 检查返回的条目数是否为1(如果<> 1则出现错误,例如没有find用户或find多个用户)

  5. 检索此单个条目的可分辨名称(DN)( ldap_get_dn() )

  6. 使用在最后一步中find的DN尝试使用身份validation页面( ldap_bind() )给出的密码绑定到LDAP服务器

  7. 如果绑定成功,那么一切正常,如果没有,最有可能的密码是错误的

起初它听起来并不那么难。 通常我会build议使用某种标准库来对Zend Framework之外的LDAP服务器(如Net_LDAP2 PEAR包或Zend_Ldap进行身份validation。 我没有实际使用Net_LDAP2经验(虽然我知道代码相当好),但是Zend_Ldap对Active Directory服务器或ADAMS服务器(这显然是你正在使用的)工作得很好。

这将使用Zend_Ldap做到这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); 

你可以使用http://pear.php.net/package/Net_LDAP2/docs它很好,工作。;

文档所采用的连接示例:

 // Inclusion of the Net_LDAP2 package: require_once 'Net/LDAP.php'; // The configuration array: $config = array ( 'binddn' => 'cn=admin,ou=users,dc=example,dc=org', 'bindpw' => 'password', 'basedn' => 'dc=example,dc=org', 'host' => 'ldap.example.org' ); // Connecting using the configuration: $ldap = Net_LDAP2::connect($config); // Testing for connection error if (PEAR::isError($ldap)) { die('Could not connect to LDAP-server: '.$ldap->getMessage()); } 

@Stephen提供了很好的观点。 这是我使用AD进行身份validation的普通PHP代码:

  1. 首先你需要知道这个参数:服务器主机,用户域(如果你想查询AD,你还需要基于dn)。
  2. 使用下面的代码:

     $ldap = ldap_connect($host); // eg 165.5.54.6 or an URL ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); // Recommended for AD ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0); $bind = ldap_bind($ldap, $username.'@'.$userDomain, $passwrod); if($bind){ // successful authentication. }