Role Based Access Control

第6回Formal Methods 勉強会で出た、RBACのモデルのお話。
こんな感じかな。

/*
 Role Based Access Control
 ロールに階層関係を追加

*/

/* ユーザアカウント */
sig User {
	roles: set Role
}
/* ロール。Admin,Guestなど */
sig Role {
  perms: set Permission,
  superRoles: set Role
}

fact {
  no r:Role | r in r.^superRoles  
}

/*割り当てられる操作。Read,Write,ReadWriteなど*/
sig Permission {}

/* ロールが階層化されているため、スーパーロールのパーミッションも取得する */
fun permissions[u:User]: set Permission {
	u.roles.*superRoles.perms
}


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'.perms = r.perms + p
}

pred removePermission[r,r':Role,p:Permission] {
	r'.perms = r.perms - p
}

run {}