|
PHP4にはLDAP関数という拡張パッケージがあり、LDAP(Lightweight Directory Access Protocol)
サーバに問合せを行う機能をPHPから呼び出すことができます。
ただし、PHP単体では使えなくてLDAP機能自体はC言語で書かれた
クライアント・ライブラリを必要とします。
LDAPのC言語クライアント・ライブラリとしては、
NetscapeのDirectory SDKとオープンソースのOpenLDAP(のクライアント部分)
が挙げられます。今回はDirectory SDKのバージョンの対応が確認できなかったため、
OpenLDAPで試しました。これはOpenLdap.org
で開発・公開されているオープンソースのLDAPサーバで、
その中にクライアント・ライブラリ(libldap.so)のソース配布も入っています。
今回は次の環境で試しました。
OS | PHP | OpenLDAP |
Solaris 2.6 | 4.2.1 | 2.0.15 |
●OpenLDAP 2.0.15のインストール
CC=gcc; export CC
LDFLAGS=-L/usr2/local/lib; export LDFLAGS
LIBS=-lgcc; export LIBS
sh configure --prefix=/usr2/local --disable-ldbm --enable-ldap
make depend; make
make install
|
OSがSolarisだったので苦労したことと言えば、普通にコンパイルすると、
後でPHPとともに起動しようとしたときに、「シンボル__eprintfが解決しない」
というエラーで起動しない現象が発生したことです。
これはlibldap.soをビルドするリンカーのオプションで、
強引に-lgccをつけてlibgcc.aとリンクすれば解決できます。
●PHPのインストール
PREFIX=/usr2/local
sh configure --with-apxs=$PREFIX/apache/bin/apxs \
--prefix=$PREFIX --enable-mbstring --enable-mbstr-enc-trans \
--enable-mbregex --without-mysql --with-ldap=$PREFIX \
--enable-versioning --with-oci8
make
make install
|
PHPのconfigure時には、--with-ldap=オプションで、
OpenLdapをインストールしたトップディレクトリを指定します。
つまり、ldap.hがそのディレクトリのincludeサブディレクトリに、
libldap.soがそのディレクトリのlibサブディレクトリに存在することを確認します。
●LDAPサーバからエントリ情報を検索するサンプル
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=Shift_JIS">
</head>
<body>
<?php
if(isset($_POST["empno"])){
$empno = $_POST["empno"];
if(trim($empno) == ""){
print "おおっと!従業員番号を入力して下さい。<br>";
exit;
}
if(! ($link_id = ldap_connect("ldap1.nsnhnkmmkk.co.jp", 389))){
print "おおっと!LDAPサーバに接続できません。<br>";
exit;
}
if(! ldap_bind($link_id, "uid=admin,ou=Applications,o=NKS-GROUP", "adminpass")){
print "おおっと!LDAP管理者認証ができません。<br>";
exit;
}
$sr=ldap_search($link_id, "o=NKS,o=NKS-GROUP", "uid=$empno");
print ldap_count_entries($link_id, $sr)."件のデータが見つかりました。";
$info = ldap_get_entries($link_id, $sr);
print $info["count"] . "件のエントリが返されました。<p>";
$a = $info[0];
$dn = $a["dn"];
$cn = $a["cn"][0];
$kanjiName = $a["cn;lang-ja"][0];
$departmentNumber = $a["departmentnumber"][0];
$telephoneNumber = $a["telephonenumber"][0];
$mailAddress = $a["mail"][0];
# ↑エントリ属性名は全部小文字
# 漢字氏名などの日本語文字は、UTF-8で返されます。
print <<<DATA
<p>
<table border="1">
<tr><td bgcolor="#cceecc">エントリID(DN)</td><td>$dn</td></tr>
<tr><td bgcolor="#cceecc">識別氏名</td><td>$cn</td></tr>
<tr><td bgcolor="#cceecc">漢字氏名</td><td>$kanjiName</td></tr>
<tr><td bgcolor="#cceecc">所属組織コード</td><td>$departmentNumber</td></tr>
<tr><td bgcolor="#cceecc">電話番号</td><td>$telephoneNumber</td></tr>
<tr><td bgcolor="#cceecc">メールアドレス</td><td>$mailAddress</td></tr>
</table>
</p>
DATA;
ldap_close($link_id);
}
else{
?>
<h1>LDAP接続テスト 従業員情報の表示</h1>
<form action="ldap-empinfo.php" method="POST">
統一ユーザID:
<input type="text" name="empno" maxlen="8" size="10"><br>
<input type="submit" value="検索"><br>
</form>
<?php
}
?>
</body></html>
|
●LDAPでエントリのパスワード認証を行うサンプル
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=Shift_JIS">
</head>
<body>
<?php
if(isset($_POST["empno"])){
$empno = $_POST["empno"];
if(trim($empno) == ""){
print "おおっと!従業員番号を入力して下さい。<br>";
exit;
}
if(trim($_POST["password"]) == ""){
print "おおっと!パスワードを入力して下さい。<br>";
exit;
}
if(! ($link_id = ldap_connect("ldap1.nsnhnkmmkk.co.jp", 389))){
print "おおっと!LDAPサーバに接続できません。<br>";
exit;
}
if(! ldap_bind($link_id, "uid=admin,ou=Applications,o=NKS-GROUP", "adminpass")){
print "おおっと!LDAP管理者認証ができません。<br>";
exit;
}
$sr=ldap_search($link_id, "o=NKS,o=NKS-GROUP", "uid=$empno");
print ldap_count_entries($link_id, $sr)."件のデータが見つかりました。";
$info = ldap_get_entries($link_id, $sr);
print $info["count"] . "件のエントリが返されました。<p>";
$a = $info[0];
$dn = $a["dn"];
if(! ldap_bind($link_id, $dn, $_POST["password"])){
print "おおっと!パスワード認証が通りません。<br>";
}
else{
print "パスワード認証OKです。<br>";
}
ldap_close($link_id);
}
else{
?>
<h1>LDAP接続テスト 従業員の認証</h1>
<form action="ldap-empauth.php" method="POST">
統一ユーザID:
<input type="text" name="empno" maxlen="8" size="10"><br>
パスワード:
<input type="password" name="password" maxlen="14" size="16"><br>
<input type="submit" value="検索"><br>
</form>
<?php
}
?>
</body></html>
|
(first uploaded 2002/06/10 last updated (not ever), URANO398 - KQ TAURA)
|