GraphQL API 的高级策略(policies)
页面摘要: 可将策略(policies)附加到 GraphQL 解析器(resolvers)上,以实现复杂的授权(authorization)规则,例如限制未认证用户的结果数量,或基于所属组(group)限制访问。
发送到 GraphQL API 的请求会经过 Strapi 的 中间件(middlewares)与 策略(policies)系统。如本简短指南所示,可将策略附加到解析器上,以实现复杂的授权规则。
有关 GraphQL 策略的更多信息,请参阅 GraphQL 插件配置 文档。
条件可见性(Conditional visibility)
要限制未认证用户返回的条目数量,可以编写一个修改解析器参数的策略:
export default async (policyContext, config, { strapi }) => {
const { state, args } = policyContext;
if (!state.user) {
args.limit = 4; // 仅向公众返回 4 条结果
}
return true;
};
在 /config/policies.ts 中注册该策略,并将其应用到某个解析器:
export default {
'api::restaurant.restaurant': {
find: [ 'global::limit-public-results' ],
},
};
组成员资格(Group membership)
策略可访问 policyContext.state.user 来检查组成员资格,如下例所示:
export default async ({ state }, config, { strapi }) => {
const userGroups = await strapi.query('plugin::users-permissions.group').findMany({
where: { users: { id: state.user.id } },
});
return userGroups.some(g => g.name === config.group);
};
按如下配置使用该策略:
export default {
'api::restaurant.restaurant': {
find: [{ name: 'global::is-group-member', config: { group: 'editors' } }],
},
};
在此配置下,只有当已认证用户属于 editors 组时,解析器才会返回结果。