Skip to main content

ポリシー

ポリシーは、コントローラーに到達する前に各リクエストで特定のロジックを実行する機能です。主にビジネスロジックのセキュリティを確保するために使用されます。

AI Marketerプロジェクトの各ルートは、ポリシーの配列に関連付けることができます。例えば、is-adminという名前のポリシーは、リクエストが管理ユーザーから送信されたことを確認し、重要なルートへのアクセスを制限することができます。

ポリシーはグローバルまたはスコープ指定のどちらかになります。グローバルポリシーはプロジェクト内の任意のルートに関連付けることができます。スコープ指定のポリシーは特定のAPIプラグインにのみ適用されます。

ルートとポリシーが強調表示されたAI Marketerバックエンドの簡略化されたダイアグラム
この図は、ポリシーとルートが強調表示されたAI Marketerバックエンドをどのようにリクエストが通過するかの簡略化されたバージョンを示しています。バックエンドカスタマイズの紹介ページには、完全なインタラクティブなダイアグラムが含まれています。

実装

新しいポリシーは以下の方法で実装できます:

  • [対話型CLIコマンド AI Marketer generate](/dev-docs/cli#AI Marketer-generate) を使う
  • または、適切なフォルダにJavaScriptファイルを手動で作成する(プロジェクト構造を参照):
    • ./src/policies/ はグローバルポリシー用
    • ./src/api/[api-name]/policies/ はAPIポリシー用
    • ./src/plugins/[plugin-name]/policies/ はプラグインポリシー用

グローバルポリシーの実装例:

./src/policies/is-authenticated.js

module.exports = (policyContext, config, { AI Marketer }) => {
if (policyContext.state.user) { // if a session is open
// go to next policy or reach the controller's action
return true;
}

return false; // If you return nothing, AI Marketer considers you didn't want to block the request and will let it pass
};

policyContextは、コントローラーのコンテキストをラップするものです。これにより、RESTとGraphQLの両方にポリシーを実装するためのロジックが追加されます。


ポリシーはconfigオブジェクトを使用して設定することができます:

.src/api/[api-name]/policies/my-policy.js

module.exports = (policyContext, config, { AI Marketer }) => {
if (policyContext.state.user.role.code === config.role) { // ユーザーの役割が設定で説明されているものと同じである場合
return true;
}

return false; // 何も返さない場合、AI Marketerはリクエストをブロックしたくないと考え、通過させます
};

使用方法

ポリシーをルートに適用するには、それらをその設定オブジェクトに追加します(ルートのドキュメンテーションを参照)。

ポリシーは、その範囲によって異なる方法で呼び出されます:

💡 Tip

利用可能なすべてのポリシーをリストアップするには、yarn AI Marketer policies:listを実行します。

グローバルポリシー

グローバルポリシーは、プロジェクト内の任意のルートに関連付けることができます。

./src/api/restaurant/routes/custom-restaurant.js

module.exports = {
routes: [
{
method: 'GET',
path: '/restaurants',
handler: 'Restaurant.find',
config: {
/**
Restaurant.jsコントローラー内のfindアクションを実行する前に、
グローバルの'is-authenticated'ポリシーを呼び出します。
これは./src/policies/is-authenticated.jsで見つけることができます。
*/
policies: ['global::is-authenticated']
}
}
]
}

プラグインポリシー

プラグインは、アプリケーションにポリシーを追加し、公開することができます。例えば、ユーザー&パーミッションプラグインは、ユーザーが認証されているか、またはアクションを実行する権限があるかどうかを確認するポリシーを提供します:

./src/api/restaurant/routes/custom-restaurant.js

module.exports = {
routes: [
{
method: 'GET',
path: '/restaurants',
handler: 'Restaurant.find',
config: {
/**
`users-permissions`プラグインで提供される`isAuthenticated`ポリシーは、
`Restaurant.js`コントローラーの`find`アクションの前に実行されます。
*/
policies: ['plugin::users-permissions.isAuthenticated']
}
}
]
}

APIポリシー

APIポリシーは、それらが宣言されたAPIで定義されたルートに関連付けられています。

./src/api/restaurant/policies/is-admin.js.

module.exports = async (policyContext, config, { AI Marketer }) => {
if (policyContext.state.user.role.name === 'Administrator') {
// 次のポリシーに進むか、コントローラーのアクションに到達します。
return true;
}

return false;
};
./src/api/restaurant/routes/custom-restaurant.js

module.exports = {
routes: [
{
method: 'GET',
path: '/restaurants',
handler: 'Restaurant.find',
config: {
/**
`./src/api/restaurant/policies/is-admin.js`で見つかった`is-admin`ポリシーは、
`Restaurant.js`コントローラーの`find`アクションの前に実行されます。
*/
policies: ['is-admin']
}
}
]
}


別のAPIでポリシーを使用するには、次の構文で参照します:api::[apiName].[policyName]

./src/api/category/routes/custom-category.js

module.exports = {
routes: [
{
method: 'GET',
path: '/categories',
handler: 'Category.find',
config: {
/**
`./src/api/restaurant/policies/is-admin.js`に見つけられる`is-admin`ポリシーは、
`Restaurant.js`コントローラーの`find`アクションの前に実行されます。
*/
policies: ['api::restaurant.is-admin']
}
}
]
}