如何在 Strapi 中添加中间件以按所有者过滤核心“查找”方法结果?

问题描述 投票:0回答:1

我目前正在尝试在 Strapi 中添加中间件,以便当用户在集合上使用核心“查找”方法时,他们只能看到自己拥有的记录。

我已经基于本文档实现了一个适用于“更新”和“删除”方法的中间件。但是,我似乎无法将此示例应用于“查找”方法,因为我无法操作查询。

当然,我可以选择创建自定义路由来完成此操作,但将其应用于现有路由以便于维护会更有效。

关于如何实现这一目标有什么见解吗?

我已经尝试使用

await next();
获取控制器的结果,然后手动过滤结果;但没有所有必要的字段来过滤这样的数据,而且我不希望这些字段出现给用户。

middleware strapi koa
1个回答
0
投票

我可以编写一个

own-records-only
中间件来过滤仅属于登录用户的记录,如下所示(
src/middlewares
中的文件):

/**
 * `own-records-only` middleware
 */

module.exports = ({ field = 'user' }, { }) => {
  return async (ctx, next) => {
    ctx.query.filters = {
      ...ctx.query.filters,
      [field]: {
        id: {
          $eq: ctx.state.user.id
        }
      }
    };

    await next();
  };
};

用法(在路由定义中):

const { createCoreRouter } = require('@strapi/strapi').factories;

module.exports = createCoreRouter('api::site.site', {
  config: {
    find: {
      middlewares: [
        { name: 'global::own-records-only', config: { field: 'user' } }
      ],
    },
  },
});

但对我来说有一个问题:

user
字段,我想用于过滤的是与“用户和权限”插件的关系。为了能够使用与用户模型相关的字段,您需要在“设置 -> 用户和权限插件 -> 角色 -> [角色]”中为用于请求的角色授予
find
权限

我希望这有帮助。

注意:我在这里谈论的是 Strapi v4.20

© www.soinside.com 2019 - 2024. All rights reserved.