ServBay で PHP の OpenLDAP 拡張を使う
ServBay は多様な技術スタックをサポートする強力なローカル Web 開発環境です。LDAP(Lightweight Directory Access Protocol)サーバーと連携する PHP アプリの開発者にとって、ServBay には標準で PHP の OpenLDAP 拡張が備わっており、簡単に有効化して利用できます。本記事では、ServBay 環境下でこの拡張機能を活用し、ユーザー認証やディレクトリ検索などを行う方法を詳しく解説します。
OpenLDAP と PHP の OpenLDAP 拡張とは?
OpenLDAP は、LDAP プロトコルに基づくディレクトリサービスを提供する、広く使われているオープンソース実装です。LDAP プロトコルは、分散ディレクトリ情報サービスへアクセス・管理するためのアプリケーションプロトコルで、企業環境ではユーザー認証、組織構造管理、アドレス帳サービスなどに広く使われています。
PHP の OpenLDAP 拡張(一般的に ldap
拡張と呼ばれます)は、PHP から LDAP サーバーへアクセスするための関数群を提供する PHP モジュールです。この拡張を利用すると、PHP アプリケーションから LDAP サーバーへ接続し、バインド(認証)、エントリ検索、追加・変更・削除など各種操作が可能になります。
ServBay で重視されるのは、PHP に組み込まれている OpenLDAP クライアント拡張です。これは PHP コードから外部の LDAP サーバーとやり取りできる機能を指します。なお、ServBay 自体は OpenLDAP サーバーそのものは含みません。
PHP OpenLDAP 拡張の主な機能
PHP の OpenLDAP 拡張を使用すると、以下の操作が可能です。
- LDAP サーバーへの接続:指定した LDAP サーバーと接続します。
- バインド操作の実行:匿名バインドまたは DN(Distinguished Name)とパスワードによる認証バインドを行います。
- ディレクトリの検索:フィルターやベース DN、範囲を指定してディレクトリエントリを検索できます。
- エントリ情報の取得:検索結果の各エントリの属性・値を取得します。
- 修正操作の実行:新規エントリ追加、削除、属性変更などの操作ができます。
- LDAP エラーの処理:操作失敗時のエラー情報を取得します。
ServBay における PHP OpenLDAP 拡張のバージョン互換性
ServBay では、複数バージョンの PHP をインストール・稼働できます。PHP の OpenLDAP 拡張は通常、公式 PHP ディストリビューションの一部として提供されており、ServBay が構築する PHP パッケージにもデフォルトで含まれています。したがって、ServBay の PHP を利用すれば、ほとんどの場合 OpenLDAP 拡張がすぐに利用可能です。
PHP OpenLDAP 拡張が有効かどうかを確認する方法
ServBay は「すぐに使える」環境を目指し、多くの主要拡張機能をデフォルトで有効化していますが、状態の確認は常におすすめします。最も簡単な方法は phpinfo()
関数を使うことです。
ServBay サイトのルートディレクトリ(デフォルトは
/Applications/ServBay/www
)でinfo.php
など新しい PHP ファイルを作成します。info.php
ファイルに以下の内容を書き込みます。php<?php phpinfo(); ?>
1
2
3サイトの設定アドレス(例:
http://servbay.demo/info.php
)へブラウザからアクセスします。表示された
phpinfo()
のページ内でldap
というセクションを探します。そのセクションがあり、中に
LDAP Support enabled
などの情報が表示されていれば、PHP の OpenLDAP 拡張が正しく読み込まれて有効化されている証拠です。
ldap
セクションが見当たらない、あるいは LDAP Support
が disabled となっている場合は、その PHP バージョンのビルドオプションを確認したり、ServBay サポートに問い合わせてください。ただし大多数のケースで標準有効となっています。
PHP コードで OpenLDAP を利用する
OpenLDAP 拡張が有効化されていることを確認したら、ldap_*
関数群を利用して LDAP サーバーと連携できるようになります。以下は LDAP サーバーへの接続、管理者バインド、ユーザー検索、および認証を行う基本サンプルです。
重要注意: 以下のサンプルコード内の LDAP サーバーアドレス、ポート番号、管理者 DN、パスワード、検索ベース、ユーザーフィルター、ユーザーパスワード等はすべてダミー値です。自己環境の実際の値・認証情報に必ず置き換えてご利用ください。パスワード等の機微情報をソースコードへ直書きすることは、本番環境では絶対に避けてください。
サンプルコード:基本的な接続・検索・認証
以下のコードを ServBay の Web サイトディレクトリに ldap_test.php
等のファイル名で保存し、ブラウザからアクセスして動作させてください。
<?php
// --- LDAP 接続設定 ---
// ご自分の LDAP サーバーアドレスに変更してください。LDAPS (SSL/TLS) の場合は ldaps:// プレフィックスとデフォルトポート 636 を利用します。
$ldapURI = "ldap://ldap.example.com:389";
// 管理者や検索権限を持つユーザーの DN(Distinguished Name)に置き換えてください
$ldapAdminRdn = "cn=admin,dc=example,dc=com";
// 上記管理者 DN に対応したパスワードに変更してください
$ldapAdminPassword = "admin_password";
// --- ユーザー検索と認証設定 ---
// LDAP ディレクトリ内でユーザーが存在するベース DN に変更してください
$searchBase = "dc=example,dc=com";
// 特定ユーザーの検索フィルター例。ここでは uid が 'servbay-demo' のユーザーを探します。
$searchFilter = "(uid=servbay-demo)";
// 認証を試みたいユーザーのパスワードに変更してください
$userPasswordToAuthenticate = "user_password_for_servbay_demo";
echo "<h2>ServBay での PHP OpenLDAP サンプル</h2>";
// 1. LDAP サーバーへ接続
echo "<p>LDAP サーバー {$ldapURI} への接続を試みます...</p>";
$ldapConn = ldap_connect($ldapURI);
if (!$ldapConn) {
die("<p style='color: red;'>エラー:LDAP サーバーへ接続できません。</p>");
}
echo "<p style='color: green;'>LDAP サーバーへ正常に接続されました。</p>";
// LDAP オプションの設定(通常はプロトコルバージョンと Referrals の無効化推奨)
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);
// 2. 管理者認証情報でのバインド(検索等の権限が必要な処理向け)
echo "<p>管理者 DN '{$ldapAdminRdn}' でバインドを試みます...</p>";
if (!ldap_bind($ldapConn, $ldapAdminRdn, $ldapAdminPassword)) {
echo "<p style='color: red;'>エラー:管理者バインドに失敗しました。</p>";
echo "<p style='color: red;'>LDAP エラー: " . ldap_error($ldapConn) . "</p>";
ldap_unbind($ldapConn); // 接続解除
die();
}
echo "<p style='color: green;'>管理者バインドに成功しました。</p>";
// 3. ユーザー検索処理
echo "<p>ベース DN '{$searchBase}' にてフィルター '{$searchFilter}' で検索を行います...</p>";
$searchResult = ldap_search($ldapConn, $searchBase, $searchFilter);
if (!$searchResult) {
echo "<p style='color: red;'>エラー:LDAP 検索に失敗しました。</p>";
echo "<p style='color: red;'>LDAP エラー: " . ldap_error($ldapConn) . "</p>";
ldap_unbind($ldapConn); // 接続解除
die();
}
echo "<p style='color: green;'>検索が成功しました。</p>";
// 4. 検索結果の取得
$entries = ldap_get_entries($ldapConn, $searchResult);
if ($entries["count"] > 0) {
echo "<p>{$entries["count"]} 件の一致エントリが見つかりました。</p>";
// 最初にマッチしたユーザーのみ注目
$userDn = $entries[0]["dn"];
echo "<p>最初のマッチユーザー DN: <strong>{$userDn}</strong></p>";
// 5. 検索ユーザー DN・パスワードで認証バインドを試みる
echo "<p>ユーザー DN '{$userDn}' で認証バインドを試みます...</p>";
// 注意:ここは管理者バインドではなく対象ユーザーバインドです
if (@ldap_bind($ldapConn, $userDn, $userPasswordToAuthenticate)) {
echo "<p style='color: green;'>ユーザー認証成功!</p>";
} else {
echo "<p style='color: red;'>ユーザー認証失敗。</p>";
echo "<p style='color: red;'>LDAP エラー: " . ldap_error($ldapConn) . "</p>";
}
} else {
echo "<p>フィルター '{$searchFilter}' に一致するユーザーが見つかりません。</p>";
}
// 6. LDAP 接続解除
echo "<p>LDAP 接続を閉じます...</p>";
ldap_unbind($ldapConn);
echo "<p style='color: green;'>接続を終了しました。</p>";
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
コードの解説
- 接続 (
ldap_connect
): LDAP サーバーとのコネクション確立。返り値は接続リソース。 - オプション設定 (
ldap_set_option
): 接続の振る舞いを設定。LDAP_OPT_PROTOCOL_VERSION, 3
で推奨の LDAPv3 プロトコルを指定、LDAP_OPT_REFERRALS, 0
で referral を無効化します(一般的な用途で不要)。 - バインド (
ldap_bind
): サーバーへ認証処理を実施。- 匿名バインド:
ldap_bind($ldapConn)
(DN・パスワード未指定、基本的に制限付きアクセス) - 認証バインド:
ldap_bind($ldapConn, $dn, $password)
(指定 DN・パスワードで認証)本サンプルではまず管理者 DN で検索用バインドし、続いて見つかったユーザー DN でユーザー認証しています。
- 匿名バインド:
- 検索 (
ldap_search
): ベース DN (searchBase
) 配下で指定フィルター (searchFilter
) にマッチするエントリを検索。 - エントリ取得 (
ldap_get_entries
): 検索結果からすべての一致エントリを多次元配列として取得。 - 接続解除 (
ldap_unbind
): LDAP サーバー接続を終了しリソース解放。
注意事項
- LDAP サーバーが必要:本記事・サンプルは OpenLDAP クライアント拡張の利用解説です。実際の接続先 LDAP サーバー(ローカル構築でもリモートの企業 LDAP/Active Directory でも可)が別途必要です。
- セキュリティ: 本番環境では LDAP 認証情報管理にベストプラクティス(環境変数利用・安全な設定ファイル・LDAPS(ポート 636)での暗号化接続など)を徹底し、LDAP (389) の平文通信は避けましょう。
- エラー処理: サンプルは簡易エラーハンドリングです。実運用では堅牢なエラー捕捉やログ記録を実装してください。
- DN フォーマット: DN(Distinguished Name)の書式は厳格ですので、自身の LDAP サーバー設定と完全一致するよう注意しましょう。
よくある質問(FAQ)
Q: phpinfo()
で ldap
セクションが表示されない、または無効化されている場合は?
A: ServBay 環境では基本的に PHP OpenLDAP 拡張が標準で有効です。対象 PHP バージョンの phpinfo()
を参照しているか確認し、見つからなければ ServBay の PHP パッケージを再インストールするか、ServBay サポートへお問い合わせください。
Q: 「Call to undefined function ldap_connect()」というエラーが出ます。
A: これは PHP の OpenLDAP 拡張が正しく読み込まれていないことを意味します。ひとつ前のセクションに戻り phpinfo()
で有効状況を確認しましょう。
Q: 拡張機能は有効だが接続やバインドで LDAP エラーが出る場合は?
A: サーバーアドレス・ポート、バインド DN/パスワードなど設定の正確性を再確認してください。LDAP エラーメッセージ(ldap_error()
関数で取得)は失敗原因のヒントになる場合が多いです(例:「Invalid credentials」- 認証情報エラー、「Can't contact LDAP server」- サーバー未到達など)。接続先 LDAP サーバーが稼働中でネットワーク接続できるかも確認しましょう。
まとめ
ServBay なら PHP の OpenLDAP 拡張を手軽に利用でき、簡単な検証作業だけで PHP 環境が LDAP サーバーと通信可能なことをチェックできます。豊富な PHP LDAP 関数群を活かせば、ローカル開発用途でも ServBay 上で認証やディレクトリ検索など多様な機能を簡単に拡張でき、開発の幅が大きく広がります。