限制属于 Strapi 所有者的 Graphql 结果

Limit Graphql results that belongs to owner in Strapi

我正在使用如下所示的简单 Strapi 策略来限制仅属于所有者的 REST 结果,其记录在以下 link.

https://github.com/strapi/strapi/issues/624

module.exports = async (ctx, next) => {
  const { id, role } = ctx.state.user;
  if(role !== 'administrator'){
    ctx.query.owner = id;
  }
  await next();
};

现在我想对 Graphql 结果执行相同的操作,但它似乎无法使用相同的代码,因为 "ctx.query" 未定义。我已经尝试查看所有请求 API,但其中 none 似乎适用于 Graphql 查询。 URL 以 'http://localhost:1337/graphql' 结尾,而 'ctx.request.query' 是一个空的 [].

https://strapi.io/documentation/3.0.0-beta.x/guides/requests.html#api-reference

你为什么在搜索 graphQL 问题的同时查看 REST 文档?根本没有 url 查询解析。

可以使用策略检查所有者角色(权限)- here 对此进行了描述。

以下部分包含杂项示例 permission/customization - 解析器有一个 context 参数。用户数据应该(未检查)在 context.state.user.

处可用

这是我为解决该问题所做的工作:

覆盖 api/activity/config/schema.graphql

中的 GraphQl 模式
module.exports = {
    definition: ``,
    query: `
        notifications(sort: String, limit: Int, start: Int, where: JSON): [Activity]
    `,
    type: {},
    resolver: {
        Query: {
            notifications: {
                description: 'Return the auth user notifications',
                policies: ['plugins.users-permissions.permissions'],
                resolver: 'Activity.findNotifications'
            },
        },
    },
};

api/activity/controllers/Activity.js

中创建一个新的函数解析器
module.exports = {

    findNotifications(ctx) {

        ctx.query = { ...ctx.query, owner: ctx.state.user.id }

        if (ctx.query._q) {
            return strapi.services.activity.search(ctx.query);
        }
        return strapi.services.activity.find(ctx.query);
    },
}

在控制器中,您获得了查询并添加了所有者 ID 过滤器。 希望对你有帮助。