36

私のプロジェクトは、私たちの大学のモジュール登録システムを作ることです。そこで、大学の 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 
4

4 に答える 4

52

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

  1. 「LDAP ホスト」と「LDAP ポート番号」( ldap_connect() ) を使用して LDAP サーバーに接続し、正しい接続オプション ( ldap_set_option() )を設定LDAP_OPT_PROTOCOL_VERSIONします。LDAP_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_bind() )で指定されたパスワードで LDAP サーバーへのバインドを試みます。

  7. バインドが成功した場合はすべて問題ありません。そうでない場合は、パスワードが間違っている可能性があります

最初は思ったほど難しくありません。Net_LDAP2通常、 PEAR パッケージやZend Frameworkなどの LDAP サーバーに対する認証には、ある種の標準ライブラリを使用することをおZend_Ldap勧めします。私は実際に使用した経験はありませんが(コードはよく知っています)、Active Directory サーバーまたは ADAMS サーバーに対しては非常にうまく機能します (これは明らかにあなたが使用しているものです)。Net_LDAP2Zend_Ldap

これは次を使用してトリックを行います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);
于 2009-02-13T18:05:49.873 に答える
4

http://code.activestate.com/recipes/101525/を試してみてくださいhttp://us3.php.net/ldapおよび[php ldap authentication]の Google 検索のその他の結果を参照してください。

于 2009-02-13T15:54:13.827 に答える
2

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());
}
于 2009-07-23T19:25:38.600 に答える