PHP から LDAP で所属グループのチェックを行う方法

特定のグループに対する所属チェックを行うことで、あるアプリケーションにおけるパーミッションが自動的に切り替われば便利ですよね。

この資料では、あるユーザーが Active Directory における特定のグループに所属しているかどうか LDAP でチェックする方法を紹介します。

LDAP によるグループの所属確認

foo.com ドメインにおける user1 が group1 に所属しているかどうかチェックしましょう。

ユーザーの DN を取得する

まず、 user1@foo.com の DN を取得します。samaccountname は user1 になります。

$ldaphost = 'foo.com';
$ldapport = 389;
$user_dn  = '...';
$username = 'username';
$password = 'password';
$samaccountname = 'user1';

$conn = ldap_connect(
     $ldaphost, 
     $ldapport);

ldap_set_option( $conn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option( $conn, LDAP_OPT_REFERRALS, 0);

$bind = ldap_bind(
     $conn,
     $username, 
     $password 
);

$attrs = array( 'memberof' );

$result = ldap_search( 
     $conn,
     'DC=foo,DC=com',
     "(samaccountname=$samaccountname)",
     $attrs
);

$info = ldap_get_entries( $conn, $result );
     
if( !$info['count'] ) {
     // ユーザー情報の取得に失敗
}

$user_dn = $info[0]['dn'];

ldap_bind に指定するユーザー名、パスワードは正しく認証できるユーザーを指定します。 user1 のユーザー名、パスワードでも構いません。(もちろん、それがわかれば、ですが)

ldap_search によって、samaccountname を指定してユーザーを取得します。

このコードでは $attrs に memberof を指定しています。これによって、取得する情報を制限しています。 ここではたまたま memberof を指定していますが、他の属性でも構いません。

ちなみに、ここで memberof を利用して取得できるグループ名はサブドメイン等の情報が入ってこない場合があるため完全な情報にはなりません。 従って、次のステップのようにグループオブジェクトを取得して、所属メンバーをチェックする必要があります。

グループオブジェクトの取得

上でユーザーの DN を取得していますので、あとは簡単です。 そのユーザー DN をメンバーに持つグループが存在するかどうかチェックすればよいのです。

$base_dn = "CN=group1,OU=ou1,DC=foo,DC=com";
$filter = "(&(objectCategory=group)(member=$user_dn))";
     
$result = ldap_search( $conn, $base_dn, $filter);
$info = ldap_get_entries($conn, $result);
          
if( !$info['count'] ) {
     // ユーザーはそのグループに所属していない
}
else {
     // ユーザーはそのグループに所属している
}

$base_dn はグループの DN ですが、これも適当に書き換えてください。グループの DN を調べるにはマイクロソフトの Ldp などのツールを使えば良いでしょう。

こちらの ldap_search でも取得する属性を制限することによって、無駄な情報を取得することはなくなりますので、 その方が望ましいです。適当に直してください。

ちなみに、 member 属性をごっそり持ってきて、ループでチェックするのはやめましょうね。単なる無駄なので search の時点で member フィルターを入れる方が賢明です。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説