Entry

プログラミング・メモ - データソースに権限管理付きでアクセスする

2007年07月22日

例えば,データベースのリソース(具体的には各レコード)に,それぞれ読み書きの権限を付けたいとします。簡単な権限管理なら,DAO クラスの条件をゴニョゴニョすればいいけれど,権限関係が複雑になってくると,せっかく CRUD に特化していたクラスだったのが if 文の分岐で汚なくなってしまいます。

そういうわけで,権限周りをうまくさばけそうなデザインはないもんか,つらつら考えていたのでした。で,ちょっと思い付いたところを図にしてみたので,メモがてらこちらに置いておきます。

proxy パターンで権限管理の図

上図は Proxy パターンを使った方法。一応,データベースに接続する際に必要なコネクションもキャッシュできる感じにしてみました。DAO のインターフェイスというと,普通は CRUD の全てを実装させるのが一般的なのかもしれないけれど,ここでは SELECT だけを実装しています。まぁ,ここら辺はただの趣味なんですけど。

権限周りは,Auth クラスが管理していて,getStrAuthCondition() メソッドが権限に対応するクエリに追加する条件式を返します。権限関係が複雑な場合は,権限関係そのものをデータベースに収めることになるんでしょうけれど,その時は Auth クラスを DAO にすれば対応できます。

んでもって,このメソッドを内部的(protected)に呼び出して,権限周りの管理をするのが ItemManageProxy#addAuthCondition() メソッドです。クライアントとしては,ユーザ ID(とか,それに相当するもん)を ItemManageProxy のコンストラクタなりなんなりに渡すだけで,普通の DAO を使うのと同じ要領で権限周りの面倒を見てもらった DAO を使えることになります。

この考え方の一番の特徴は,Proxy パターンを使うことで DAO を汚染しなくてもいいことです。実際,ItemMagage クラスは,自分が権限管理されているのか全く知らずにクエリを実行します。もっとも,これを使うと,クラスの数がかなり多くなってしまうので(こういうもんは普通テーブルの数だけ作る),ソースの管理は面倒っちいことになりそうです。あまりに数が多い場合は,ItemManageProxy を抽象クラスにするなりして使い回すのがいいかもしれません。Factory 化するのもひとつの手になるのかな

権限周りは基礎的な機能だから,パターン化されているもんだと思っていたんですけど,きれいに実装されているケースはあまりない感じがします。基礎的な機能だけに取って付けたような実装にはするべきじゃないとは思ってるんですけどね……ゴニョゴニョ。もうちょっと考えてみます。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN