認可制御
このドキュメントでは,Pulsate API(v0) における認可制御について記述する.
用語
Actor: アクションを実行する主体.Accountが該当する.Action: リソースに対して行う何らかの操作のこと.read: 読み取りwrite: 書き込み,更新(リソースが更新可能な場合),リソースの削除
Resource:Actionの対象となるもの.Target: 操作が許可されたときに使用する,操作を行うまたは操作後のリソースを保存するもの.Policy:ActorがActionを実行するための条件.
全体像
- Pulsate API での認可制御は Policy を接尾辞にもつクラス群によって定義される.
- この Policy クラス群の各クラスは
withCheckstatic メソッドを持ち,actor, action, resource, targetの3値,および関数fnを要求する.withCheckメソッドはジェネリクス<Target,Res>を受け取る.Targetは target の型,Resはfnの返値である.
interface PolicyArgs<Actor, Action, Resource> {
actor: Actor;
action: Action;
resource: Resource;
}
type NotePolicyArgs = PolicyArgs<Account, NotePolicyAction, Note>;
class NotePolicy {
static withCheck<Target, Res>(
target: Target,
): (
args: NotePolicyArgs,
fn: (target: Target) => Promise<Result.Result<Error, Res>>,
) => Promise<Result.Result<Error, Res>> {
return async (
args: AccountPolicyArgs,
fn: (target: Target) => Promise<Result.Result<Error, Res>>,
): Promise<Result.Result<Error, Res>> => {
if (!args.actor) return Result.err(Error("ログインしないと使えません"));
// 条件を満たしたときだけ実行する
return await fn(target);
};
}
}
PolicyAction
Action は識別子 PolicyAction を用いて識別する.
- PolicyAction は3つの要素からなる文字列である.
- 要素は以下の通り.
- 1: ポリシー名
- 2: モデル名 (例:
account,note)- モデルではないものも含む (例:
follow). - タイムラインの場合はタイムライン種別名とする (例:
home,conversation)
- モデルではないものも含む (例:
- 3: アクション名
- これらは以下で示す型で表現できる形式に従って結合される.
type PolicyAction = `${PolicyName}.${ModelName}:${ActionName}`;
withCheckメソッドは,PolicyAction のポリシー名が自分が管理するものでない場合,エラーを返す.