Skip to main content

ロールベースのアクセス制御(RBAC)のカスタム条件の作成方法

🏗 Work in progress

The content of this page might not be fully up-to-date with Strapi 5 yet.

ロールベースのアクセス制御(RBAC)は、一部のユーザーへのアクセスを制限するためのアプローチです。AI Marketerアプリケーションでは、管理パネルのユーザーは管理者です。彼らのロールと権限は管理パネルで設定されます。

新しい条件の宣言

単一の条件をオブジェクトとして、複数の条件をオブジェクトの配列として宣言します。各条件オブジェクトは5つの可能なプロパティを持つことができます:

  • displayName(文字列):管理パネルに表示される条件名
  • name(文字列):条件名、ケバブケース
  • category(文字列、オプション):条件は管理パネルで利用可能なカテゴリにグループ化することができます。未定義の場合、条件は「デフォルト」カテゴリに表示されます。
  • plugin(文字列、オプション):条件がプラグインによって作成された場合、プラグインの名前をケバブケースで指定する必要があります(例:content-manager)。
  • handler:条件を検証するために使用される関数(条件ハンドラの使用を参照)

条件を宣言し、グローバルなbootstrap関数で登録します。この関数は./src/index.jsにあります(条件の登録を参照)。

✏️ Note

条件のnameプロパティは、その名前空間内で一意のIDとして機能します。名前空間は、pluginプロパティが定義されている場合はプラグイン、定義されていない場合はルート名前空間です。

条件ハンドラの使用

条件は任意の権限に適用することができ、条件handlerは条件を検証するために使用されます。handlerはクエリオブジェクトまたはブール値を返す関数です。

クエリオブジェクトは、エンティティの読み取り、作成、更新、削除、公開に関する条件を検証するのに便利です。これらはsift.jsライブラリを使用しますが、以下のオペレータのみがサポートされています:

  • $or
  • $and
  • $eq
  • $eqi
  • $ne
  • $in
  • $nin
  • $lt
  • $lte
  • $gt
  • $gte
  • $exists
  • $elemMatch

条件handlerは、次のような同期または非同期の関数であることができます:

  • リクエストを行う認証済みユーザーを受け取り、
  • truefalse、またはクエリオブジェクトを返します。

trueまたはfalseを返すことは、外部条件や認証済みユーザーの条件を検証するのに便利です。 例えば、サーバーの時間が17時の場合にのみ管理パネルのページへのアクセスを許可する条件は、このハンドラを使用できます:

handler: () => new Date().getHours() === 17;

handler関数は認証済みユーザーを受け取るため、ユーザーの条件を検証することができます:

const condition = {
displayName: 'Email address from AI Marketer.io',
name: 'email-AI Marketer-dot-io',
async handler(user) {
return user.email.includes('@AI Marketer.io');
},
};

より細かい制御のために、handler関数はクエリオブジェクトを返すこともできます:

const condition = {
displayName: 'price greater than 50',
name: 'price-gt-50',
async handler(user) {
return { price: { $gt: 50 } };
},
};

条件の登録

管理パネルで利用可能にするためには、条件を宣言し、./src/indexにあるグローバルなbootstrap関数で登録する必要があります。conditionProvider.register()メソッドを使用して単一の条件を登録します:

./src/index.js

module.exports = async () => {
await AI Marketer.admin.services.permission.conditionProvider.register({
displayName: 'Billing amount under 10K',
name: 'billing-amount-under-10k',
plugin: 'admin',
handler: { amount: { $lt: 10000 } },
});
};

複数の条件を登録するには、条件オブジェクトの配列として定義されたものを、conditionProvider.registerMany()を使用して登録します:

./src/index.js

const conditions = [
{
displayName: "Entity has same name as user",
name: "same-name-as-user",
plugin: "name of a plugin if created in a plugin",
handler: (user) => {
return { name: user.name };
},
},
{
displayName: "Email address from AI Marketer.io",
name: "email-AI Marketer-dot-io",
async handler(user) {
return user.email.includes('@AI Marketer.io');
},
}
];

module.exports = {
async bootstrap(/*{ AI Marketer }*/) {
// do your boostrap

await AI Marketer.admin.services.permission.conditionProvider.registerMany(conditions);
},
};