web-dev-qa-db-ja.com

PHP=からLDAPを使用してユーザーを認証する

私のプロジェクトは、大学のモジュール登録システムを作成することです。そこで、学生をシステムに認証するための詳細について、大学のIT担当者に問い合わせました。既存の大学ログインを使用してシステムを開発しています。彼らは私にいくつかのLDAP情報を与えました、私はその使用法を知りません。 ApachaサーバーでPHP、Mysqlを使用しています。 LDAP情報を含むユーザーIDとパスワードを指定して、システムにログインしているユーザーを認証するにはどうすればよいですか。

以下に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 
35
John

一般的な手順は次のとおりです(括弧内の関連するext/ldap phpコマンド):

  1. 「LDAPホスト」と「LDAPポート番号」を使用してLDAPサーバーに接続し( ldap_connect() )、正しい接続オプションを設定します( ldap_set_option() )、特にLDAP_OPT_PROTOCOL_VERSIONおよびLDAP_OPT_REFERRALS

  2. 「バインドするLDAPアカウント」と「LDAPアカウントのパスワード」を使用してLDAPサーバーにバインドします( ldap_bind() )-Active Directoryサーバーに対して認証する場合は、ユーザー名とパスワードを直接使用できますログインページを開き、次のすべての手順をスキップします。

  3. 「ベースDN」と適切なLDAPフィルターを指定して、一致するユーザーエントリ/オブジェクトをツリーで検索します-(&(objectClass=user)(sAMAccountName=%s))のようなもので、%sは認証対象のユーザー名に置き換える必要があります(--- ldap_search()

  4. 返されたエントリの数が1であるかどうかを確認します(<> 1の場合、何かが間違っている、たとえばユーザーが見つからない、または複数のユーザーが見つかった)

  5. この単一エントリの識別名(DN)を取得します( ldap_get_dn()

  6. 最後の手順で見つかったDNを使用して、認証ページで指定されたパスワードでLDAPサーバーにバインドしようとします( ldap_bind()

  7. バインドが成功した場合、すべてがOKです。そうでない場合、ほとんどの場合パスワードが間違っています

最初は思ったほど難しくありません。一般的に、LDAPサーバーに対する認証には、 Net_LDAP2 PEAR packageまたは Zend_LdapZend 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);
52
Stefan Gehrig

http://code.activestate.com/recipes/101525/ を参照しながら http://us3.php.net/ldap およびその他の結果を [php ldap authentication] のGoogle検索。

4
Emil Sit

@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. 
    }
    
2
PHPst

http://pear.php.net/package/Net_LDAP2/docs を使用できます。

ドキュメントがとる接続の例:

// 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());
}
2
damko