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 组时,解析器才会返回结果。