AlloyAnalizer をちまちま使ってみる
仕様をモデル化してその関係性を洗うツールだそうで。
勉強元はこれ http://thinkit.co.jp/story/2010/09/22/1766?page=0,1
とりあえずチュートリアルを流そう
sig User { roles:set Role } sig Role { permissions: set Permission } sig Permission {} run{}
そして、処理してできた「Instance」をクリックすると、発生しうる関連性を図示してくれると。
set以外にも
lone | 0 または1 |
one | 1 |
set | 0 以上 |
some | 1 以上 |
で設定できると、、、。
ビジュアルウィンドウでの操作は、
-> | 集合同士に対して指定、新しい関係を作る |
. | 2 集合のジョイン |
そしたら、関数を使って、関係をたどり、あるユーザの持つ権限の集合を取得するとな
fun perms[u:User]:set Permission { u.roles.permissions }
なるほど。Role に上位権限を持たせて
sig Role { permissions: set Permission, superRoles:set Role }
ループしないように条件を指定
fact { no r:Role | r in r.^superRoles }
文法から、
fact | 事実条件の設定 |
no | 否定 |
r:Role | Role に関する条件 |
in | 前途の引数が保持する何か |
^ | たどり着ける要素全部 |
なるほどね。
/* ユーザーにロールを付与する。 */ pred addRole[u,u':User,r:Role] { u'.roles=u.roles + r } /* ユーザーからロールをはく奪する。 */ pred removeRole[u,u':User,r:Role] { u'.roles=u.roles - r } /* ロールに権限を付与する。 */ pred addPermission[r,r':Role,p:Permission] { r'.permissions=r.permissions + p } /* ロールから権限をはく奪する。 */ pred removePermission[r,r':Role,p:Permission] { r'.permissions=r.permissions - p }
とか使えると。