権限
このドキュメントでは、スキーマを通してCMSユーザー(以下、ユーザー)のアクセス権限を定義する方法を説明します。
コンセプト
ロール、グループ、ルールの3つの概念を組み合わせることで、柔軟なアクセス制御を実現します。
ロールとグループ
権限は ロール と グループ に紐づきます。ユーザーをロールやグループに所属させることで権限を付与します。
例えば、以下のようにロールと権限を紐付けます。
- 管理者: すべてのリソースに対して読み取りと書き込みができる
- 編集者: コンテンツのリソースに対して読み取りと書き込みができる
- 閲覧者: コンテンツのリソースに対して読み取りができる
グループとマルチテナント
ユーザーとデータをグループに紐付けることで、マルチテナントに適したアクセス制御を実現します。
異なるグループに属するデータは論理的に分離されます。同じグループに所属するユーザーでなければアクセスできません。
例えば、店舗A、店舗B の2つのグループがあるとします。
このとき店舗Aに属するデータは、店舗Aに属するユーザーのみアクセスでき、店舗Bに属するユーザーはアクセスできません。全店舗を管理するユーザーには、グループを横断してアクセスできる権限を設定できます。
ルール
ルールはどのリソースに対して、どのような操作ができるかを定義します。
リソースとは以下を指します。
- テーブル
- バケット
それぞれのリソースに対して、以下の操作を定義できます。
- 読み取り権限: リソースの読み取りができるかどうか
- 書き込み権限: リソースの書き込みができるかどうか
権限は 許可 と 拒否 の2つの方法で制御できます。
権限の定義
権限を定義する際には、authorities
プロパティを使用します。
以下の例では、editor
ロールに対して、blog
テーブルと photo
バケットに対する読み書きを許可しています。また、ユーザー管理の操作を拒否しています。
import type { Orizm } from "@orizm/cms-sdk";
// 注意: tables, tableModules, buckets は省略しています
export default {
authorities: [
{
match: { role: "editor" },
allowTables: ["blog"],
allowBuckets: ["photo"],
denyUserManagement: true,
},
],
} satisfies Orizm.ProjectDefine;
match
match
プロパティで、グループとロールに対して紐付けます。
グループまたはロールのどちらかのみ指定することも、両方を指定することもできます。指定がない場合は、全てのユーザーに対してルールが適用されます。
{
match: {
group: "storeA",
role: "editor",
},
}
allow / deny
allow(許可)
と deny(拒否)
プロパティで権限を定義します。使用できるルールは ルール一覧 を参照してください。
{
allowTables: ["blog"],
allowBuckets: ["photo"],
denyUserManagement: true,
}
どのように適用されるか
適用される権限は以下のように決まります。
同一オブジェクト内では deny
が優先される
同一オブジェクト内で allow
と deny
が両方定義されている場合、deny
が優先されます。
例えば以下の例では、最終的に blog
テーブルへのアクセスは 拒否 されます。
[
{
allowTables: ["blog"],
denyTables: ["blog"],
},
];
同一オブジェクト内では詳細度の高いルールが優先される
テーブルに関するルールを例に挙げると、以下の通り上から順に優先されます。
denyReadTables
/denyWriteTables
allowReadTables
/allowWriteTables
denyTables
allowTables
denyAllTables
allowAllTables
以下の例では、最終的に blog
テーブルへの 読み取り のみが 許可 されます。
[
{
allowReadTables: ["blog"],
denyWriteTables: ["blog"],
allowTables: ["blog"],
denyAllTables: true,
},
];
authorities
配列の後で定義されたルールが優先される
authorities プロパティの定義は先頭から順に評価されます。後で定義されたルールにマッチした場合、それまでのルールを上書きします。
例えば以下の例では、最終的に blog
テーブルへの読み書きは 許可 されます。
[
{
denyTables: ["blog"],
},
{
allowTables: ["blog"],
},
];
権限定義の例
全ユーザーに全権限を付与
[
{
allowAllTables: true,
allowAllBuckets: true,
allowUserManagement: true,
allowAllGroups: true,
},
];
読み取りと書き込みのロールを分離
[
{
// ロールなしのユーザーはアクセス拒否
denyAllTables: true,
denyAllBuckets: true,
denyUserManagement: true,
allowAllGroups: true,
},
{
// 閲覧者ロールは読み込みのみ許可
match: { role: "viewer" },
allowReadTables: ["blog"],
allowReadBuckets: ["photo"],
},
{
// 編集者ロールは読み込みと書き込みを許可
match: { role: "editor" },
allowAllTables: true,
allowAllBuckets: true,
},
{
// 管理者ロールは全権限を許可
match: { role: "admin" },
allowAllTables: true,
allowAllBuckets: true,
allowUserManagement: true,
},
];
マルチテナント
[
{
// ロールなしのユーザーはアクセス拒否
denyAllTables: true,
denyAllBuckets: true,
denyUserManagement: true,
},
{
// 閲覧者ロール
// 所属するグループのブログコンテンツの読み込みのみ許可
match: { role: "viewer" },
allowReadTables: ["blog"],
allowReadBuckets: ["photo"],
},
{
// 編集者ロール
// 所属するグループのブログコンテンツの読み書きを許可
match: { role: "editor" },
allowTables: ["blog"],
allowBuckets: ["photo"],
},
{
// テナント管理者
// 所属するグループのブログコンテンツの読み書きと
// ユーザー管理を許可
match: { role: "manager" },
allowTables: ["blog"],
allowBuckets: ["photo"],
allowUserManagement: true,
},
{
// 全権限を持つ管理者
match: { group: "admin" },
allowAllTables: true,
allowAllBuckets: true,
allowUserManagement: true,
allowAllGroups: true,
},
];
ルール一覧
- allowAllTables
- denyAllTables
- allowTables
- denyTables
- allowReadTables
- denyReadTables
- allowWriteTables
- denyWriteTables
- allowAllBuckets
- denyAllBuckets
- allowBuckets
- denyBuckets
- allowReadBuckets
- denyReadBuckets
- allowWriteBuckets
- denyWriteBuckets
- allowUserManagement
- denyUserManagement
- allowAllGroups
allowAllTables
すべてのテーブルに対して 読み取りと書き込み を 許可 します。
{
allowAllTables: true,
}
denyAllTables
すべてのテーブルに対して 読み取りと書き込み を 拒否 します。
{
denyAllTables: true,
}
allowTables
指定したテーブルに対して 読み取りと書き込み を 許可 します。
{
allowTables: ["blog", "category", "tag"],
}
denyTables
指定したテーブルに対して 読み取りと書き込み を 拒否 します。
{
denyTables: ["blog", "category", "tag"],
}
allowReadTables
指定したテーブルの 読み取り を 許可 します。
{
allowReadTables: ["blog", "category", "tag"],
}
denyReadTables
指定したテーブルの 読み取り を 拒否 します。
{
denyReadTables: ["blog", "category", "tag"],
}
allowWriteTables
指定したテーブルの 書き込み を 許可 します。
{
allowWriteTables: ["blog", "category", "tag"],
}
denyWriteTables
指定したテーブルの 書き込み を 拒否 します。
{
denyWriteTables: ["blog", "category", "tag"],
}
allowAllBuckets
すべてのバケットに対して 読み取りと書き込み を 許可 します。
{
allowAllBuckets: true,
}
denyAllBuckets
すべてのバケットに対して 読み取りと書き込み を 拒否 します。
{
denyAllBuckets: true,
}
allowBuckets
指定したバケットに対して 読み取りと書き込み を 許可 します。
{
allowBuckets: ["photo", "video", "audio"],
}
denyBuckets
指定したバケットに対して 読み取りと書き込み を 拒否 します。
{
denyBuckets: ["photo", "video", "audio"],
}
allowReadBuckets
指定したバケットの 読み取り を 許可 します。
{
allowReadBuckets: ["photo", "video", "audio"],
}
denyReadBuckets
指定したバケットの 読み取り を 拒否 します。
{
denyReadBuckets: ["photo", "video", "audio"],
}
allowWriteBuckets
指定したバケットの 書き込み を 許可 します。
{
allowWriteBuckets: ["photo", "video", "audio"],
}
denyWriteBuckets
指定したバケットの 書き込み を 拒否 します。
{
denyWriteBuckets: ["photo", "video", "audio"],
}
allowUserManagement
ユーザー管理の操作を 許可 します。
{
allowUserManagement: true,
}
denyUserManagement
ユーザー管理の操作を 拒否 します。
{
denyUserManagement: true,
}
allowAllGroups
すべてのグループのリソースに対してアクセスを許可します。
{
allowAllGroups: true,
}