我的项目是为我们的大学制作模块注册系统。所以我联系了我大学的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
答案 0 :(得分:52)
一般程序是(括号中相关的ext / ldap php命令):
使用“LDAP主机”和“LDAP端口号”(ldap_connect())连接到LDAP服务器并设置正确的连接选项(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 Framework。我没有实际使用Net_LDAP2
的经验(虽然我非常了解代码),但Zend_Ldap
可以很好地对抗Active Directory服务器或ADAMS服务器(显然你正在使用它)。< / p>
这将使用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);
答案 1 :(得分:4)
您可以在引用http://code.activestate.com/recipes/101525/以及Google搜索http://us3.php.net/ldap的其他结果时尝试[php ldap authentication]。
答案 2 :(得分:2)
您可以使用http://pear.php.net/package/Net_LDAP2/docs 这很好,很有效。
doc:
连接的示例// 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());
}
答案 3 :(得分:2)
使用以下代码:
$ldap = ldap_connect($host); // e.g. 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.
}