BitArts Blog

ロードバイク通勤のRubyプログラマで伊豆ダイバー。の個人的なブログ。

mod_auth_pgsqlで重複ユーザー名を無視する方法

PostgreSQLで管理されたユーザー情報で認証処理を行うのに大変便利なmod_auth_pgsql。便利なだけでなく、後付けで横断的に認証処理を追加できるので、単純な認証漏れなどセキュリティホールを作り込みにくく、アプリケーションの実装に干渉しないので、美しい。

で、そのmod_auth_pgsqlではユーザー名の重複したレコードがあると認証に失敗する。もちろん普通はユーザー名フィールドにはunique制約を付けるはずだから普通は問題ないはずだけど。でも変な設計のテーブルにおいて、重複を無視して強制的に最初に見つかったレコードを使って認証を行う裏技設定。mod_auth_pgsqlのソースを追っかけて、方法を思いついた。

Auth_PG_pwd_whereclause "limit 1"

だってなぜか要求仕様レベルでテーブル設計が付いてきちゃったんだもん。本来、正当な理由なく「このほうがシンプルだから」みたいな理由で正規化を行わないというのは、シンプルなんじゃなくて、単にスキーマ設計を手抜きしているだけ。理由なく正規化されていないデータベースは、後々必ず問題を起こす。今回の件でも、いずれ「パスワード変更したんだけど、反映されないよ」みたいな連絡が来るのが目に見えているので、メモっといて、その時になって自分が悩まないようにしておく。最近なぜか、正しく設計されていないデータベースを扱う事が多く、毎回同じようなトラブルが出ているんだよなあ。要求仕様として出てきた管理項目をそのままテーブルに当てはめて設計してしまってるだけなんだろうなあ。