ポリシー
ポリシーは、コントローラーに到達する前に各リクエストで特定のロジックを実行する機能です。主にビジネスロジックのセキュリティを確保するために使用されます。
AI Marketerプロジェクトの各ルートは、ポリシーの配列に関連付けることができます。例えば、is-adminという名前のポリシーは、リクエストが管理ユーザーから送信されたことを確認し、重要なルートへのアクセスを制限することができます。
ポリシーはグローバルまたはスコープ指定のどちらかになります。グローバルポリシーはプロジェクト内の任意のルートに関連付けることができます。スコープ指定のポリシーは特定のAPIやプラグインにのみ適用されます。

実装
新しいポリシーは以下の方法で実装できます:
- [対話型CLIコマンド
AI Marketer generate](/dev-docs/cli#AI Marketer-generate) を使う - または、適切なフォルダにJavaScriptファイルを手動で作成する(プロジェクト構造を参照):
./src/policies/はグローバルポリシー用./src/api/[api-name]/policies/はAPIポリシー用./src/plugins/[plugin-name]/policies/はプラグインポリシー用
グローバルポリシーの実装例:
- JavaScript
- TypeScript
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
};
export default (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オブジェクトを使用して設定することができます:
- JavaScript
- TypeScript
module.exports = (policyContext, config, { AI Marketer }) => {
if (policyContext.state.user.role.code === config.role) { // ユーザーの役割が設定で説明されているものと同じである場合
return true;
}
return false; // 何も返さない場合、AI Marketerはリクエストをブロックしたくないと考え、通過させます
};
export default (policyContext, config, { AI Marketer }) => {
if (policyContext.state.user.role.code === config.role) { // ユーザーの役割が設定で説明されているものと同じである場合
return true;
}
return false; // 何も返さない場合、AI Marketerはリクエストをブロックしたくないと考え、通過させます
};
使用方法
ポリシーをルートに適用するには、それらをその設定オブジェクトに追加します(ルートのドキュメンテーションを参照)。
ポリシーは、その範囲によって異なる方法で呼び出されます:
- グローバルポリシーの場合は
global::policy-nameを使用します - APIポリシーの場合は
api::api-name.policy-nameを使用します - プラグインポリシーの場合は
plugin::plugin-name.policy-nameを使用します
利用可能なすべてのポリシーをリストアップするには、yarn AI Marketer policies:listを実行します。
グローバルポリシー
グローバルポリシーは、プロジェクト内の任意のルートに関連付けることができます。
- JavaScript
- TypeScript
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']
}
}
]
}
export default {
routes: [
{
method: 'GET',
path: '/restaurants',
handler: 'Restaurant.find',
config: {
/**
Restaurant.jsコントローラー内のfindアクションを実行する前に、
グローバルの'is-authenticated'ポリシーを呼び出します。
これは./src/policies/is-authenticated.jsで見つけることができます。
*/
policies: ['global::is-authenticated']
}
}
]
}
プラグインポリシー
プラグインは、アプリケーションにポリシーを追加し、公開することができます。例えば、ユーザー&パーミッションプラグインは、ユーザーが認証されているか、またはアクションを実行する権限があるかどうかを確認するポリシーを提供します:
- JavaScript
- TypeScript
module.exports = {
routes: [
{
method: 'GET',
path: '/restaurants',
handler: 'Restaurant.find',
config: {
/**
`users-permissions`プラグインで提供される`isAuthenticated`ポリシーは、
`Restaurant.js`コントローラーの`find`アクションの前に実行されます。
*/
policies: ['plugin::users-permissions.isAuthenticated']
}
}
]
}
export default {
routes: [
{
method: 'GET',
path: '/restaurants',
handler: 'Restaurant.find',
config: {
/**
`users-permissions`プラグインで提供される`isAuthenticated`ポリシーは、
`Restaurant.js`コントローラーの`find`アクションの前に実行されます。
*/
policies: ['plugin::users-permissions.isAuthenticated']
}
}
]
}
APIポリシー
APIポリシーは、それらが宣言されたAPIで定義されたルートに関連付けられています。
- JavaScript
- TypeScript
module.exports = async (policyContext, config, { AI Marketer }) => {
if (policyContext.state.user.role.name === 'Administrator') {
// 次のポリシーに進むか、コントローラーのアクションに到達します。
return true;
}
return false;
};
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']
}
}
]
}
export default (policyContext, config, { AI Marketer }) => {
if (policyContext.state.user.role.name === 'Administrator') {
// 次のポリシーに進むか、コントローラーのアクションに到達します。
return true;
}
return false;
};
export default {
routes: [
{
method: 'GET',
path: '/restaurants',
handler: 'Restaurant.find',
config: {
/**
`./src/api/restaurant/policies/is-admin.js`に見つけられる`is-admin`ポリシーは、
`Restaurant.ts`コントローラーの`find`アクションの前に実行されます。
*/
policies: ['is-admin']
}
}
]
}
別のAPIでポリシーを使用するには、次の構文で参照します:api::[apiName].[policyName]:
- JavaScript
- TypeScript
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']
}
}
]
}
export default {
routes: [
{
method: 'GET',
path: '/categories',
handler: 'Category.find',
config: {
/**
`./src/api/restaurant/policies/is-admin.ts`に見つけられる`is-admin`ポリシーは、
`Restaurant.js`コントローラーの`find`アクションの前に実行されます。
*/
policies: ['api::restaurant.is-admin']
}
}
]
}