Skip to Content

権限

このドキュメントでは、スキーマを通してCMSユーザー(以下、ユーザー)のアクセス権限を定義する方法を説明します。

コンセプト

ロール、グループ、ルールの3つの概念を組み合わせることで、柔軟なアクセス制御を実現します。

ロールとグループ

権限は ロールグループ に紐づきます。ユーザーをロールやグループに所属させることで権限を付与します。

例えば、以下のようにロールと権限を紐付けます。

  • 管理者: すべてのリソースに対して読み取りと書き込みができる
  • 編集者: コンテンツのリソースに対して読み取りと書き込みができる
  • 閲覧者: コンテンツのリソースに対して読み取りができる

グループとマルチテナント

ユーザーとデータをグループに紐付けることで、マルチテナントに適したアクセス制御を実現します。

異なるグループに属するデータは論理的に分離されます。同じグループに所属するユーザーでなければアクセスできません。

例えば、店舗A店舗B の2つのグループがあるとします。
このとき店舗Aに属するデータは、店舗Aに属するユーザーのみアクセスでき、店舗Bに属するユーザーはアクセスできません。全店舗を管理するユーザーには、グループを横断してアクセスできる権限を設定できます。

ルール

ルールはどのリソースに対して、どのような操作ができるかを定義します。

リソースとは以下を指します。

  • テーブル
  • バケット

それぞれのリソースに対して、以下の操作を定義できます。

  • 読み取り権限: リソースの読み取りができるかどうか
  • 書き込み権限: リソースの書き込みができるかどうか

権限は 許可拒否 の2つの方法で制御できます。

権限の定義

権限を定義する際には、authorities プロパティを使用します。

以下の例では、editor ロールに対して、blog テーブルと photo バケットに対する読み書きを許可しています。また、ユーザー管理の操作を拒否しています。

orizm.config.ts
import { defineConfig } from "@orizm/cli/config"; export default defineConfig({ authorities: [ { match: { role: "editor" }, allowTables: ["blog"], allowBuckets: ["photo"], denyUserManagement: true, }, ], });

match

match プロパティで、グループとロールに対して紐付けます。

グループまたはロールのどちらかのみ指定することも、両方を指定することもできます。指定がない場合は、全てのユーザーに対してルールが適用されます。

{ match: { group: "storeA", role: "editor", }, }

allow / deny

allow(許可)deny(拒否) プロパティで権限を定義します。使用できるルールは ルール一覧 を参照してください。

{ allowTables: ["blog"], allowBuckets: ["photo"], denyUserManagement: true, }

どのように適用されるか

適用される権限は以下のように決まります。

同一オブジェクト内では deny が優先される

同一オブジェクト内で allowdeny が両方定義されている場合、deny が優先されます。

例えば以下の例では、最終的に blog テーブルへのアクセスは 拒否 されます。

[ { allowTables: ["blog"], denyTables: ["blog"], }, ];

同一オブジェクト内では詳細度の高いルールが優先される

テーブルに関するルールを例に挙げると、以下の通り上から順に優先されます。

  1. denyReadTables / denyWriteTables
  2. allowReadTables / allowWriteTables
  3. denyTables
  4. allowTables
  5. denyAllTables
  6. 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

すべてのテーブルに対して 読み取りと書き込み許可 します。

{ 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, }
Last updated on