我的项目是为我们大学制作一个模块招生系统。因此,我联系了我大学的 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 命令):
使用“LDAP 主机”和“LDAP 端口号”(ldap_connect())连接到 LDAP 服务器并设置正确的连接选项(ldap_set_option()),尤其是
LDAP_OPT_PROTOCOL_VERSION
和LDAP_OPT_REFERRALS
使用“要绑定(bind)的 LDAP 帐户”和“LDAP 帐户密码”( ldap_bind() ) 绑定(bind)到 LDAP 服务器 - 如果您针对 Active Directory 服务器进行身份验证,则可以直接使用来自登录页面并跳过以下所有步骤。
通过指定“BASE DN”和适当的 LDAP 过滤器在树中搜索匹配的用户条目/对象 - 很可能类似于
(&(objectClass=user)(sAMAccountName=%s))
其中%s
应替换为要进行身份验证的用户名 ( ldap_search() )检查返回的条目数是否为 1(如果 <> 1 则出现错误,例如未找到用户或找到多个用户)
检索此单个条目 (ldap_get_dn()) 的专有名称 (DN)
使用在上一步中找到的 DN 尝试使用在身份验证页面 (ldap_bind()) 中提供的密码绑定(bind)到 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) {
// 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/