php - 从 PHP 使用 LDAP 验证用户

标签 php authentication ldap

我的项目是为我们大学制作一个模块招生系统。因此,我联系了我大学的 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 

最佳答案

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

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

  2. 使用“要绑定(bind)的 LDAP 帐户”和“LDAP 帐户密码”( ldap_bind() ) 绑定(bind)到 LDAP 服务器 - 如果您针对 Active Directory 服务器进行身份验证,则可以直接使用来自登录页面并跳过以下所有步骤。

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

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

  5. 检索此单个条目 (ldap_get_dn()) 的专有名称 (DN)

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

  7. 如果绑定(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) {
    // something failed - inspect $e
}
// bind successful
$acctname = $ldap->getCanonicalAccountName('user', Zend_Ldap::ACCTNAME_FORM_DN);

关于php - 从 PHP 使用 LDAP 验证用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/546438/

相关文章:

javascript - 在php中将数据保存到mysql数据库后,如何在按钮单击中切换选项卡?

php - jquery ajax请求多个返回值?

ssl - LdapConnection 端口 636 在没有 SSL 的情况下连接

android - Android 中的 AWS Mobile Hub 自定义身份验证

java - 通过 Java API 从远程主机访问 HDFS,用户身份验证

Postgresql - 针对 Active Directory (AD) 的 LDAP 身份验证 - 来自 linux 服务器的问题,而来自 windows 服务器的正常

java - 在 LDAP 查询中是否可以加入?

php - 简单的 html dom 解析器 $html 为空

php - database.php 在 laravel 中不起作用

azure - Azure AD B2C 调用signin-oidc 回调时出现 500 错误