Strapi v5认证API过滤报错Invalid key referrant 问题求助
Strapi v5 多对多关联表权限过滤问题解决
问题原因
当API权限设为公开时,Strapi会跳过字段级权限校验,因此你能通过referrant字段正常过滤;但切换为Referrant角色认证后,Strapi的权限系统会严格校验请求中涉及的所有字段的访问权限——你仅给了Referrant角色访问ReferrantToAgent列表的权限,却未开放该模型中referrant关联字段的读权限,导致过滤时触发"Invalid key referrant"的校验错误。
解决步骤
1. 配置字段级权限
- 进入Strapi后台,依次打开 Settings → Users & Permissions Plugin → Roles
- 找到Referrant角色,进入其权限配置页
- 定位到ReferrantToAgent模型的权限项:
- 确保
find(列表查询)权限已开启 - 点击
find权限旁的齿轮图标,进入字段权限配置界面 - 在字段列表中找到
referrant关联字段,勾选它的读权限,保存配置
- 确保
2. 优化请求逻辑(安全升级)
手动传递referrant的ID存在被篡改的风险,建议通过自定义策略自动注入当前登录用户的ID:
- 在
src/api/referrant-to-agent/policies目录下创建filter-by-current-referrant.js:
module.exports = async (policyContext, config, { strapi }) => { const currentReferrantId = policyContext.state.user.documentId; policyContext.query.filters = { ...policyContext.query.filters, referrant: { documentId: { $eq: currentReferrantId } } }; return true; };
- 修改
src/api/referrant-to-agent/routes/referrant-to-agent.js,给find路由绑定策略:
module.exports = { routes: [ { method: 'GET', path: '/referrant-to-agent', handler: 'referrant-to-agent.find', config: { policies: ['plugin::users-permissions.isAuthenticated', 'api::referrant-to-agent.filter-by-current-referrant'], }, }, // 保留其他原有路由 ], };
- 之后用户只需请求
GET /api/referrant-to-agent?populate=agent,系统会自动过滤当前用户的关联数据,无需手动传参。
3. 验证效果
重启Strapi服务,用Referrant角色的有效JWT令牌发起请求,确认过滤功能正常,不再返回权限校验错误。
内容的提问来源于stack exchange,提问作者Itay Tur
相关产品推荐
相关产品推荐

