Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

認可制御

このドキュメントでは,Pulsate API(v0) における認可制御について記述する.

用語

  • Actor: アクションを実行する主体.Accountが該当する.
  • Action: リソースに対して行う何らかの操作のこと.
    • read: 読み取り
    • write: 書き込み,更新(リソースが更新可能な場合),リソースの削除
  • Resource: Actionの対象となるもの.
  • Target: 操作が許可されたときに使用する,操作を行うまたは操作後のリソースを保存するもの.
  • Policy: ActorActionを実行するための条件.

全体像

  • Pulsate API での認可制御は Policy を接尾辞にもつクラス群によって定義される.
  • この Policy クラス群の各クラスは withCheck static メソッドを持ち,actor, action, resource, targetの3値,および関数 fn を要求する.
    • withCheck メソッドはジェネリクス <Target,Res> を受け取る.Target は target の型,Resfn の返値である.
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 のポリシー名が自分が管理するものでない場合,エラーを返す.