共用モジュールを特定サイトで利用させない

当たり前ですがモジュールを多く作れば作るほど共用化したくなります。自動ログイン、セッション引継、DB設定などはその典型的なものだと思います。
ですが、サーバーに溜まってきた便利なモジュールであっても違うサイトで共用するわけにはいきません。また、管理者とユーザーではセキュリティーの観点からもモジュールの利用は暗示的に区別されていなければなりません。明示的に区別しようとすれば(=毎回区別しなければいけないとしたら)近い将来に必ずささいな設定漏れによって安全が破壊されるでしょう。


そのための便利な方法がホスト名やディレクトリ階層による暗示的な区別です。単純に言ってしまうと、特定のディレクトリ以下のモジュールの利用を特定のドメインに限定する、ということです。
例を挙げると以下の通りです。

  • モジュールA,B,C,D,Eがある
  • A,B,Cのモジュールはドメインfoo.jpでのみ利用させたい
  • C,D,Eのモジュールはドメインbar.jpでのみ利用させたい

ディレクトリ構成は以下の通り

/var/www/webapp/modules/foo/A
/var/www/webapp/modules/foo/B
/var/www/webapp/xxx/C
/var/www/webapp/modules/bar/D
/var/www/webapp/modules/bar/E

これを実現するためにphpグローバル変数$_SERVERの値をチェックする以下のvalidatorを作成します。

ディレクトリ/var/www/webapp/modules/foo直下に以下のmaple.iniを作成します。

[GlobalFilter]
Validate =

[Validate]
action.server = "1,現在のドメインでこの機能はできません,HTTP_HOST,foo.jp"

ディレクトリ/var/www/webapp/modules/bar直下に以下のmaple.iniを作成します。

[GlobalFilter]
Validate =

[Validate]
action.server = "1,現在のドメインでこの機能はできません,HTTP_HOST,bar.jp"


これによって上述したモジュール利用条件を守ることができます。

  • モジュールA,B,C,D,Eがある
  • A,B,Cのモジュールはドメインfoo.jpでのみ利用させたい
  • C,D,Eのモジュールはドメインbar.jpでのみ利用させたい

共用部はあきらめてください :-P


ちなみに、この例ではactionにvalidateを設定していますが特にactionである必要はありません。やってくることが確実なリクエストならどれでも良いです。ただ、actionのようにほぼ利用が確実であるリクエストに適用するのが個人的にしっくり来ました。


validatorのパラメータや判定条件を工夫すれば、複数ドメインでの利用や特定ドメインのみを利用させないなどできると思います。