ジョナサンの構造から拡張して、私はいくつかの変更を加えました:
Users:
+ userid
+ roleid /* Associate a Role to a User */
Roles:
+ roleid
+ rolename
+ roleinherit /* Added this field */
Permissions:
+ permissionid
+ permissionname
RolePermissions:
+ roleid
+ permissionid /* Associate a Permission to a Role */
他の役割から継承できることは、アクセス制御を簡素化するのに本当に役立ちます。たとえば、「モデレーター」ロールは「ゲスト」ロールを継承する「ユーザー」ロールを継承すると言うことができます。そうすれば、モデレーターでさえできないことをできるゲストがいることは決してありません。
もちろん、チェックする単純なクエリを作成できなくなったため、この構造を実装するのは難しいかもしれません。これらを処理する良い方法は、ユーザーの役割のデータをプルする再帰関数を作成し、それを継承された役割のこの関数の結果とマージすることです。
function getPermissions($roleID) {
// get info about this role and store it in $permissions. Assume we also set $inheritFrom
if ($inheritFrom == 0) return $permissions;
else return array_merge($permissions, getPermissions($inheritFrom));
}
この関数は重くなる可能性があるため、必ずキャッシュしてください。