昨日の書き込みの続編です。

jflute様のコメント

  • USER
  • USER_ROLE *関連テーブル
  • ROLE
  • ROLE_FUNCTION *関連テーブル
  • FUNCTION

という5つのテーブルを作って、
「ロール」と「機能」をn:nの関係にします。
「機能」には「とある画面のXxx機能」が格納されます。
但し、ここの粒度はシステムによりけりで、
単純に画面だけでユニークな場合もあれば、細かく画面とボタン単位
な場合もあります。もっと単純に画面とか関係なく
「Insert/Update/Delete/その他」もありえるでしょう。
粒度が荒い細かいのいずれにせよ、この形でほとんどまかなっています。

とある画面の「読み取り権限、書き込み権限」を表現する時は、
ROLE_FUNCTIONに「読み取り・書き込みフラグ」を立てて、
「機能」には単純に画面を入れるやり方と、
「機能」に「とある画面の読み取り」と「とある画面の書き込み」を
入れるやり方と二通りあります。
(つまりは「機能」をどういった単にするかがポイント)』

もう少し教えていただけませんでしょうか?

早速設計してみましたが、下記のような単純な設計になりました。
読み取り権限、書き込み権限系は、

「機能」に「とある画面の読み取り」と「とある画面の書き込み」を入れるやり方

を取り入れようとしています。

■Userテーブル
id
:
省略

■UserRole
user_id
role_id
version

■Roleテーブル
id
role_name
version

■RoleFunction(関連テーブル)
role_id
function_id

■Functionテーブル
id
function_name
version

これで、一応権限系制御はできるかと思いますが、
具体的にイメージした時に以下のようになるかと思います。

前提:horohoro1でログイン。horohoro1は一般ユーザなのでユーザ情報更新はできない。
1.(例えば)horohoro1はユーザ情報更新画面のユーザ情報更新をするボタンを押す
2.システムはHttpSessionに存在するhorohoro1のロール群を見に行き、そのロール群が
 持っているファンクション名をひとつずつ確認する
3.システムはファンクション名を確認した結果「ユーザ情報更新」と名前のファンクション名
 が存在しないので、更新処理はできませんというエラーを出す

※または、ユーザ情報更新画面へのリンクは2と3を行った結果、表示させないようにすることでも実現できる。

■質問1
テーブルのカラムが非常に単純なものですが、何か足りないものはありますでしょうか?

■質問2
制御の処理の流れは、上記1〜3のようなイメージで、jflute様が行っているやり方と相違ないでしょうか?

お手数ですが、教えていただけますと嬉しいです。