如何为Setting内容类型创建与users-permissions角色的关联并配置权限
实现Strapi单条目级别的角色权限控制(针对Setting内容类型)
步骤1:给Setting内容类型添加与角色的关联
Strapi默认的角色模型属于users-permissions插件,需手动修改Setting的schema创建关联:
- 打开Setting内容类型的schema文件:
./src/api/setting/content-types/setting/schema.json - 在
attributes对象中添加allowedRoles字段,配置与角色的多对多关联:
{ "attributes": { // 你的其他字段... "allowedRoles": { "type": "relation", "relation": "manyToMany", "target": "plugin::users-permissions.role", "inversedBy": null } } }
- 重启Strapi服务,后台编辑Setting条目时即可看到选择允许访问角色的选项。
步骤2:修改控制器实现权限校验
修改Setting控制器,在查询数据时根据当前用户角色过滤结果:
- 打开控制器文件:
./src/api/setting/controllers/setting.js - 替换默认的
find和findOne方法,添加角色过滤逻辑:
module.exports = { async find(ctx) { // 管理员直接返回所有数据 const isAdmin = ctx.state.user?.roles?.some(role => role.type === 'admin'); if (isAdmin) { return super.find(ctx); } // 获取当前用户的角色ID集合 const userRoles = ctx.state.user?.roles || []; const roleIds = userRoles.length ? userRoles.map(role => role.id) : [strapi.config.get('plugin.users-permissions.settings.defaultRoles.public')]; // 查询仅允许当前角色访问的Setting条目 return strapi.db.query('api::setting.setting').findMany({ where: { allowedRoles: { id: { $in: roleIds } } } }); }, async findOne(ctx) { const { id } = ctx.params; // 管理员直接返回目标条目 const isAdmin = ctx.state.user?.roles?.some(role => role.type === 'admin'); if (isAdmin) { return super.findOne(ctx); } // 获取当前用户的角色ID集合 const userRoles = ctx.state.user?.roles || []; const roleIds = userRoles.length ? userRoles.map(role => role.id) : [strapi.config.get('plugin.users-permissions.settings.defaultRoles.public')]; // 查询目标条目并校验角色权限 const setting = await strapi.db.query('api::setting.setting').findOne({ where: { id, allowedRoles: { id: { $in: roleIds } } } }); if (!setting) { return ctx.notFound('Setting不存在或你无访问权限'); } return setting; } };
- 保存文件后,Strapi会自动热重载,无需重启服务。
最后配置基础权限
在Strapi后台的设置 > 角色与权限中,给Public和Authenticated角色开启Setting内容类型的find和findOne权限,确保控制器的细粒度过滤能生效。
内容的提问来源于stack exchange,提问作者arnaudpf
相关产品推荐
相关产品推荐

