BASIC認証のグループ設定を自動で更新する

.htaccessによるBASIC認証でアクセス制御しているサイトで、ユーザーリストから、特定のルールに沿ったユーザー名のみ抽出して使いたい案件が出た。頭文字にaが付いているユーザーだけを認証する、みたいな。ユーザーリストはデータベースでなく、テキストファイル。

データベースでなくても.htaccess正規表現が使えるから簡単に出来そう、と最初は思ったが、実際にはユーザー名に正規表現は使えなかった。そもそも、認証するユーザー名にワイルドカードが使えたら危なすぎるから当然か。

ユーザーの絞込み目的には、BASIC認証にグループという機能がちゃんと用意されているので、グループリストを作ればいい。作り方は簡単で、グループ名:ユーザー名 ユーザー名…といった書式でテキストファイルを用意して、.htaccessでグループとして読み込んで使う。

ただし、ユーザーリストが静的なものならこれで問題ないものの、動的に更新されている場合は、グループリストの更新のタイミングが問題になる。コマンドラインからユーザーを追加された場合、どうやって検知し、反映するか。

.htaccessから呼ぶグループリストのパスに、phpなりperlなりのスクリプトを置いて、そのまま加工済みデータを渡せたら、と試すも、不発。スクリプトを置いても、単なるテキストとしか認識しないらしい。

cronで監視するのもタイムラグが出るし、更新頻度を上げるのは無駄すぎる。たかが読み出し専用のテキストデータに、CGIでの管理やデータベース認証するような大げさな話にしたくない。手軽で効率の良い方法はないものか、と考え続けて、思いついた方法。

「認証を失敗した時のエラーページに更新スクリプトを書けばいい」


BASIC認証.htaccessファイルに、以下を付け加えた。

ErrorDocument 401 /error/error.php

error.phpには、元になるユーザーリストを読み込んでグループリストをファイルに出力する記述を書いておく。ブラウザへの表示には、実際のエラーページから取ってきたhtmlを使えば、見た目の判別はつかない。(エラーページへのパスはブラウザに表示されない)error.phpの設置場所をもっと複雑なパスにしておけば、更に安心。ただし、呼び出し可能な状態にはしておかないとならないようだ。

追加されたばかりのユーザーが認証を受けようとした場合、初回は当然失敗する。しかし、失敗した瞬間にグループリストが更新されて、ユーザーはすぐに認証されるようになる。

実際にやってみると、これで上手くいく。この仕組みをユーザーには知らせておかなくても、初回一度の認証失敗はタイプミスかと思うだけだろうから、気づくことはないだろう。