|
1 | | -# アクセス制御 |
2 | | - |
3 | | -## アカウントのロール |
4 | | - |
5 | | -ロールは自分以外のアカウントに対して操作を実行可能であるかを制御する. |
6 | | - |
7 | | -表1: 可能な操作一覧 |
8 | | - |
9 | | -| 操作名 | 備考 | `Admin` | `Moderator` | |
10 | | -| :--------------: | :------------------------------------------: | :-----: | :---------: | |
11 | | -| 他アカウント | 凍結、サイレンスの実行、アカウント情報の閲覧 | Y | Y | |
12 | | -| ノート/メディア | ノート/メディアの削除 | Y | Y | |
13 | | -| 通報に関する操作 | 通報の確認/解決、警告の送信 | Y | Y | |
14 | | -| 不要メディア削除 | どこからも参照されないメディアの削除 | Y | N | |
15 | | -| 統計情報 | 稼働統計情報の閲覧 | Y | Y | |
16 | | -| システム設定 | 設定値の閲覧/変更 | Y | N | |
17 | | -| お知らせ | お知らせの送信、編集 | Y | N | |
18 | | -| カスタム絵文字 | 登録、無効化、削除 | Y | Y | |
19 | | -| 他インスタンス | インスタンスのサイレンス/ブロック | Y | N | |
20 | | - |
21 | | -※ Y: 操作、閲覧が可能 / N: 操作、閲覧が不可能 |
22 | | - |
23 | | -### Admin (管理者) |
24 | | - |
25 | | -管理者.\ |
26 | | -全ての操作が実行可能. |
27 | | - |
28 | | -### Moderator (モデレーター) |
29 | | - |
30 | | -モデレーター.\ |
31 | | -(自他問わず)インスタンス、お知らせ以外の操作を実行可能 |
32 | | - |
33 | | -> [!IMPORTANT] |
34 | | -> |
35 | | -> モデレーターは一般ロールのアカウントに対する操作のみ実行可能. |
36 | | -
|
37 | | -### Normal (一般) |
38 | | - |
39 | | -通常のユーザー.\ |
40 | | -自分のリソースに対する操作のみを行うことが可能. |
41 | | - |
42 | | -## メールアドレス検証状態 |
43 | | - |
44 | | -メールアドレスの検証が行われたかを示すもの. |
45 | | - |
46 | | -### notActivated (メールアドレス未検証) |
47 | | - |
48 | | -メールアドレスの検証が行われていない状態.\ |
49 | | -検証が行われていないアカウントは一定期間(設定可能)経過後に自動で削除される(設定で行わないことも可能) |
50 | | - |
51 | | -メールアドレス検証トークンの再送信のリクエスト と アカウント削除 のみ実行可能. |
52 | | - |
53 | | -### Active (メールアドレス検証済み) |
54 | | - |
55 | | -メールアドレスの検証が行われたことを示す状態. |
56 | | - |
57 | | -設定されているロールの権限に基づく全ての操作が実行可能になる. |
58 | | - |
59 | | -## アカウント状態 |
60 | | - |
61 | | -アカウントの現在の状態を示すもの. |
62 | | - |
63 | | -### Notmal(通常) |
64 | | - |
65 | | -通常の状態.\ |
66 | | -設定されているロール権限に基づく全ての操作が実行可能. |
67 | | - |
68 | | -> [!IMPORTANT] |
69 | | -> |
70 | | -> ただし、メールアドレス検証状態が`notActivated`である場合はそちらが優先される |
71 | | -
|
72 | | -### Frozen(凍結済み) |
73 | | - |
74 | | -凍結済み状態.\ |
75 | | -ログインを含む全ての操作が**実行不可能**.\ |
76 | | -そのアカウントの投稿, |
77 | | -メディアは`Admin`/`Moderator`ロール以外のアカウントから閲覧できなくなる. |
78 | | - |
79 | | -> [!IMPORTANT] |
80 | | -> |
81 | | -> 凍結状態が解除(解凍)された場合は、投稿やメディアは他のアカウントから閲覧可能になる. |
82 | | -
|
83 | | -### Silenced(サイレンス済み) |
84 | | - |
85 | | -サイレンス済み状態.\ |
86 | | -そのアカウントは新規投稿の公開範囲で`PUBLIC`を選択できなくなる |
87 | | - |
88 | | -> [!IMPORTANT] |
89 | | -> |
90 | | -> サイレンス状態が解除されても、サイレンス中に行われた投稿の公開範囲は変更されない. |
| 1 | +# 認可制御 |
| 2 | + |
| 3 | +このドキュメントでは,Pulsate API(v0) における認可制御について記述する. |
| 4 | + |
| 5 | +## 用語 |
| 6 | + |
| 7 | +- `Actor`: アクションを実行する主体.`Account`が該当する. |
| 8 | +- `Action`: リソースに対して行う何らかの操作のこと. |
| 9 | + - `read`: 読み取り |
| 10 | + - `write`: 書き込み,更新(リソースが更新可能な場合),リソースの削除 |
| 11 | +- `Resource`: `Action`の対象となるもの. |
| 12 | +- `Target`: |
| 13 | + 操作が許可されたときに使用する,操作を行うまたは操作後のリソースを保存するもの. |
| 14 | +- `Policy`: `Actor`が`Action`を実行するための条件. |
| 15 | + |
| 16 | +## 全体像 |
| 17 | + |
| 18 | +- Pulsate API での認可制御は Policy を接尾辞にもつクラス群によって定義される. |
| 19 | +- この Policy クラス群の各クラスは `withCheck` static メソッドを持ち,actor, |
| 20 | + action, resource, targetの3値,および関数 `fn` を要求する. |
| 21 | + - `withCheck` メソッドはジェネリクス `<Target,Res>` を受け取る.`Target` は |
| 22 | + target の型,`Res` は `fn` の返値である. |
| 23 | + |
| 24 | +```ts |
| 25 | +interface PolicyArgs<Actor, Action, Resource> { |
| 26 | + actor: Actor; |
| 27 | + action: Action; |
| 28 | + resource: Resource; |
| 29 | +} |
| 30 | + |
| 31 | +type NotePolicyArgs = PolicyArgs<Account, NotePolicyAction, Note>; |
| 32 | + |
| 33 | +class NotePolicy { |
| 34 | + static withCheck<Target, Res>( |
| 35 | + target: Target, |
| 36 | + ): ( |
| 37 | + args: NotePolicyArgs, |
| 38 | + fn: (target: Target) => Promise<Result.Result<Error, Res>>, |
| 39 | + ) => Promise<Result.Result<Error, Res>> { |
| 40 | + return async ( |
| 41 | + args: AccountPolicyArgs, |
| 42 | + fn: (target: Target) => Promise<Result.Result<Error, Res>>, |
| 43 | + ): Promise<Result.Result<Error, Res>> => { |
| 44 | + if (!args.actor) return Result.err(Error("ログインしないと使えません")); |
| 45 | + // 条件を満たしたときだけ実行する |
| 46 | + return await fn(target); |
| 47 | + }; |
| 48 | + } |
| 49 | +} |
| 50 | +``` |
| 51 | + |
| 52 | +### PolicyAction |
| 53 | + |
| 54 | +Action は識別子 PolicyAction を用いて識別する. |
| 55 | + |
| 56 | +- PolicyAction は3つの要素からなる文字列である. |
| 57 | +- 要素は以下の通り. |
| 58 | + - 1: ポリシー名 |
| 59 | + - 2: モデル名 (例: `account`, `note`) |
| 60 | + - モデルではないものも含む (例: `follow` ). |
| 61 | + - タイムラインの場合はタイムライン種別名とする (例: `home`, `conversation`) |
| 62 | + - 3: アクション名 |
| 63 | +- これらは以下で示す型で表現できる形式に従って結合される. |
| 64 | + |
| 65 | +```ts |
| 66 | +type PolicyAction = `${PolicyName}.${ModelName}:${ActionName}`; |
| 67 | +``` |
| 68 | + |
| 69 | +- `withCheck` メソッドは,PolicyAction |
| 70 | + のポリシー名が自分が管理するものでない場合,エラーを返す. |
0 commit comments