PHPとLDAP関数

 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)のソース配布も入っています。 今回は次の環境で試しました。

OSPHPOpenLDAP
Solaris 2.64.2.12.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>

Open Source Web Architecture Top

(first uploaded 2002/06/10 last updated (not ever), URANO398 - KQ TAURA)

楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル