(おまけ) PHP AD認証

PHP での active directory 認証してみる。

php.net にサンプルが載っているので拝借〜

<?php
$username = "rti";
$password = "秘密!";
$ldap_url = 'ad.rti7743.local';
$ldap_domain = 'rti7743.local';
$ldap_dn = "dc=rti7743,dc=local";

$ds = ldap_connect( $ldap_url );
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);


// now try a real login
$login = ldap_bind( $ds, "$username@$ldap_domain", $password );
echo '- Logged In Successfully<br/><br/>';
try{
       /*
       $attributes = array("displayname", "mail",
       "department",
       "title",
       "physicaldeliveryofficename",
       "manager");
       */
       $attributes= array("*");
       $filter = "(&(objectCategory=person)(sAMAccountName=$username))";

       $result = ldap_search($ds, $ldap_dn, $filter, $attributes);

       $entries = ldap_get_entries($ds, $result);

       if($entries["count"] > 0){
               echo print_r($entries[$i],1)."<br />";
       }
       catch(Exception $e){
               ldap_unbind($ds);
               return;
       }
       ldap_unbind($ds);
       echo '<br/><br/>- Logged Out';
?>

で、これを実行すると、いろいろ情報が画面に出力されます。
そのなかで、memberof という値に、所属グループが入っています。
この値を利用して、できるできないを作成します。

["memberof"]=>
array(5) {
 ["count"]=>
 int(4)
 [0]=>
 "CN=グループ1,CN=Users,DC=rti7743,DC=local"
 [1]=>
 "CN=グループ2,CN=Users,DC=rti7743,DC=local"
 [2]=>
 "CN=グループ3,CN=Users,DC=rti7743,DC=local"
}

もし、AD認証をガチで使う場合は、「〜できるグループ」のように名前をつけていけば結構平和になると思います。

"CN=管理ページにログインすることができるグループ,CN=Users,DC=rti7743,DC=local"


一応、日本語も、utf-8 で受け取れます。
ですが、あまり気持ちのいいものではないので、英数字にするのがおすすめかな。


この php を実行するには、 php-ldap モジュールが必要です。
ただし、ldapのバインドの是非をみているだけなのでパスワードが平文がネットワークに流れてしまうのがデメリットです。
ガチでケルベロス認証すればパスワードはネットに流れないのですが、 php からやるのは結構大変だと思うので・・・