You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Setting内容类型创建与users-permissions角色的关联并配置权限

实现Strapi单条目级别的角色权限控制(针对Setting内容类型)

步骤1:给Setting内容类型添加与角色的关联

Strapi默认的角色模型属于users-permissions插件,需手动修改Setting的schema创建关联:

  1. 打开Setting内容类型的schema文件:./src/api/setting/content-types/setting/schema.json
  2. 在attributes对象中添加allowedRoles字段,配置与角色的多对多关联:
{
  "attributes": {
    // 你的其他字段...
    "allowedRoles": {
      "type": "relation",
      "relation": "manyToMany",
      "target": "plugin::users-permissions.role",
      "inversedBy": null
    }
  }
}
  1. 重启Strapi服务,后台编辑Setting条目时即可看到选择允许访问角色的选项。

步骤2:修改控制器实现权限校验

修改Setting控制器,在查询数据时根据当前用户角色过滤结果:

  1. 打开控制器文件:./src/api/setting/controllers/setting.js
  2. 替换默认的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;
  }
};
  1. 保存文件后,Strapi会自动热重载,无需重启服务。

最后配置基础权限

在Strapi后台的设置 > 角色与权限中,给Public和Authenticated角色开启Setting内容类型的find和findOne权限,确保控制器的细粒度过滤能生效。

内容的提问来源于stack exchange,提问作者arnaudpf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:25:06