ロールベースのアクセス制御(RBAC)のカスタム条件の作成方法
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にあります(条件の登録を参照)。
条件のnameプロパティは、その名前空間内で一意のIDとして機能します。名前空間は、pluginプロパティが定義されている場合はプラグイン、定義されていない場合はルート名前空間です。
条件ハンドラの使用
条件は任意の権限に適用することができ、条件handlerは条件を検証するために使用されます。handlerはクエリオブジェクトまたはブール値を返す関数です。
クエリオブジェクトは、エンティティの読み取り、作成、更新、削除、公開に関する条件を検証するのに便利です。これらはsift.jsライブラリを使用しますが、以下のオペレータのみがサポートされています:
$or$and$eq$eqi$ne$in$nin$lt$lte$gt$gte$exists$elemMatch
条件handlerは、次のような同期または非同期の関数であることができます:
- リクエストを行う認証済みユーザーを受け取り、
true、false、またはクエリオブジェクトを返します。
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()メソッドを使用して単一の条件を登録します:
- JavaScript
- TypeScript
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 } },
});
};
export default 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()を使用して登録します:
- JavaScript
- TypeScript
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);
},
};
// path: ./src/index.ts
const conditions = [
{
displayName: "エンティティはユーザーと同じ名前",
name: "same-name-as-user",
plugin: "プラグインで作成した場合のプラグインの名前"
handler: (user) => {
return { name: user.name };
},
},
{
displayName: "AI Marketer.ioからのメールアドレス",
name: "email-AI Marketer-dot-io",
async handler(user) {
return user.email.includes('@AI Marketer.io');
},
}
];
export default async () => {
// あなたのブートストラップを行います
await AI Marketer.admin.services.permission.conditionProvider.registerMany(conditions);
};