権限設計
誰が何の役割を持つかはその時その時で異なる。
役割は状況によって変化していく。
同じユーザーでも状況によって権限が変動する。
Unix の sudo コマンドのように一時的な昇格のようなことがある。
基本的には2つの結合
誰が何の役割を持つのか。(認証(Authentication)とロール(Role))
役割は何の操作ができるのか。(ロールと認可(Authorization))
状況により何の操作ができるのか (条件による制約)
固定的ではなく、何らかの状況(文脈、コンテキスト)に依存する。
タスクでは「誰が(どの役割が)できるか」ではなく「今のユーザーのコンテキストではどの操作ができるか」で設計する。
code:pseudo
// ダメな例
if (not user.is_admin) {
print("管理者ではありません");
return;
}
code:pseudo
// 良い例
if (not user_ctx.can("edit.xxx")) {
print("編集権限がありません");
return;
}
問題
具体的に内部的にはどうやって判定する?
直接わかっているのは3つ。
ユーザー(ユーザー名, ユーザーID)
操作
操作対象