Apache 2.2のBasic認証のユーザー管理をPostgreSQLでやる。

旧来使えてたって言われている*1mod_auth_pgsqlはApache 2.2の認証モジュールの仕様変更で駄目になっている(っぽい)。

んで、Apache 2.2からは認証とユーザー管理の部分を分離しているんで、その分離されたユーザー管理の部分をPostgreSQLでやるようなモジュールを使う。
分離されたうんぬんは http://www.atmarkit.co.jp/flinux/special/apache22/apache01.html に詳しくのってるのでそこを参照してくださいな。

というわけでmod_authn_pgsqlの導入しようと思ったんだけど、日本語の情報はおろか、英語の情報もまったくみつからない。
つーわけでソースコード読んでなんとなく理解してみる。

CentOS4.4のApache 2.2.3と2.2.4で動作確認したっぽい。

 wget http://hypermail.linklord.com/new-httpd/att-4846/mod_authn_pgsql.c
 /usr/local/apache2/bin/apxs -cia -I/usr/local/pgsql/include mod_authn_pgsql.c

Apache再起動してインストールは終了

あとは認証の設定をするべし。
.htaccess

AuthName                "PGSQL"(通常のAuthNameと同じ)
AuthBasicAuthoritative  off(とりあえずOff)
AuthBasicProvider       pgsql(認証方式の定義)
AuthType                Basic(Basic認証)
#AuthPGSQLHost          localhost(書かなくてもいい)
AuthPGSQLHostaddr       127.0.0.1(DBサーバーのIPアドレス/ホスト名じゃ駄目)
AuthPGSQLPort           5432(ポート番号)
AuthPGSQLConnectionTimeout      10(タイムアウトまでの時間)
AuthPGSQLDatabase       DBName(ユーザーテーブルが入っているDB名)
AuthPGSQLUser           postgres(接続ID)
AuthPGSQLPassword       postgres(接続パスワード)
AuthPGSQLSSLMode        disable(SSL使用するか/大概はdisable)
AuthPGSQLSelect         "select userid from usertable where userid = '%u' and password = '%p'"
require valid-user

な感じで設定するといける。

ついでにユーザー情報を格納しているテーブルは

         Table "public.usertable"
  Column  |       Type        | Modifiers
                                                                                  • -
userid | character varying | password | character varying |

こんな感じ。

ただ、他の情報(このユーザーが有効かどうかのフラグとか、本名)とか持ってても問題なさげ。
AuthPGSQLSelectで設定するので。

AuthPGSQLSelectの%uがBasic認証のユーザー名/%pがパスワードになります。
受けた認証情報をそのまま受け流し、レコードが帰ってきたら認証という扱いのようです。

AuthPGSQLSelectで

select userid from usertable where userid = '%u' and password = '%p' and enabled = 't'

みたいなSQL使ってアカウントの有効性までチェックしてみたり、パスワード無視してユーザー名と有効フラグだけ確認してBasic認証するっていう時にも使えそう*2

このモジュールはどっかのMyDNSみたいな変なところ*3でこけたりしないのでいい子だ。

*1:使ったことないけど

*2:んなことするわけねーだろ

*3:文字コードUTF-8にしてたら使えなかった