使用PHP从LDAP验证用户

时间:2009-02-13 15:50:14

标签: 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 

4 个答案:

答案 0 :(得分:52)

一般程序是(括号中相关的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过滤器在树中搜索匹配的用户条目/对象 - 很可能类似于(&(objectClass=user)(sAMAccountName=%s)),其中%s应由用户名替换要经过身份验证(ldap_search()

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

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

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

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

  8. 它真的没有最初听起来那么难。通常我建议使用某种标准库来验证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)

@Stephen提供了很好的分数。这是我使用AD进行身份验证的纯PHP代码:

  1. 首先你需要知道这些参数:服务器主机,用户域(如果你想要查询AD,你还需要基数dn。)。
  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. 
    }