我目前正在尝试在 Strapi 中添加中间件,以便当用户在集合上使用核心“查找”方法时,他们只能看到自己拥有的记录。
我已经基于本文档实现了一个适用于“更新”和“删除”方法的中间件。但是,我似乎无法将此示例应用于“查找”方法,因为我无法操作查询。
当然,我可以选择创建自定义路由来完成此操作,但将其应用于现有路由以便于维护会更有效。
关于如何实现这一目标有什么见解吗?
我已经尝试使用
await next();
获取控制器的结果,然后手动过滤结果;但没有所有必要的字段来过滤这样的数据,而且我不希望这些字段出现给用户。
我可以编写一个
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