権限

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

コンセプト

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

ロールとグループ

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

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

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

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

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

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

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

ルール

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

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

  • テーブル
  • バケット

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

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

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

権限の定義

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

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

orizm.config.ts
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 が優先される

同一オブジェクト内で 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,
}