从 PHP 使用 LDAP 对用户进行身份验证

2022-08-30 13:08:14

我的项目是为我们的大学建立一个模块注册系统。因此,我联系了我所在大学的IT人员,以获取详细信息,以对系统中的学生进行身份验证。我们正在使用现有的大学登录名开发该系统。他们给了我一些LDAP信息,我不知道它的用法。我在Apacha服务器上使用PHP,Mysql。如何对登录我的系统的用户进行身份验证,给定他的用户ID和密码以及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 

答案 1

一般过程是(括号中的相关 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服务器进行身份验证,则可以直接从登录页面使用用户名和密码,并跳过所有以下步骤。

  3. 通过指定“BASE DN”和相应的LDAP过滤器在树中搜索匹配的用户条目/对象 - 很可能是应该用要进行身份验证的用户名替换的位置(ldap_search()(&(objectClass=user)(sAMAccountName=%s))%s)

  4. 检查返回的条目数是否为1(如果<>1,则说明出现问题,例如未找到用户或找到多个用户)

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

  6. 使用在上一步中找到的 DN 尝试使用身份验证页面 (ldap_bind() 中给出的密码绑定到 LDAP 服务器)

  7. 如果绑定成功,则一切正常,如果不是,则很可能是密码错误

这真的不像最初听起来那么难。通常,我建议使用某种标准库来针对LDAP服务器进行身份验证,例如Net_LDAP2 PEAR包或Zend Framework中的Zend_Ldap。我没有实际使用的经验(尽管我非常了解代码),但对Active Directory服务器或ADAMS服务器(这显然是你正在使用的)非常有效。Net_LDAP2Zend_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);

答案 2

您可以尝试 http://code.activestate.com/recipes/101525/,同时参考Google搜索[php ldap身份验证]的 http://us3.php.net/ldap 和其他结果。


推荐