📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

在 Easysearch 安全系统中创建新角色或更新现有角色的权限配置。

API 格式 #

PUT /_security/role/{name}

API 作用 #

该 API 用于创建或更新安全角色:

  • 创建新角色并定义其权限
  • 完全更新现有角色的配置
  • 定义集群级别和索引级别的权限

API 参数 #

路径参数 #

参数类型是否必填默认值描述
{name}String-角色名称

请求体参数 #

参数类型是否必填默认值描述
clusterString[][]集群级别的权限列表
indicesObject[][]索引级别的权限配置数组
descriptionString-角色的描述信息
reservedBooleanfalse是否为保留角色(仅超级管理员可设置)
hiddenBooleanfalse是否为隐藏角色
staticBooleanfalse是否为静态角色(不可修改)

indices 数组元素结构 #

字段类型是否必填描述
namesString[]索引模式列表(如 ["*"]["logs-*"]
privilegesString[]索引权限列表(如 ["ALL"]["READ_UT"]
queryString文档级安全查询(过滤文档)
field_securityString[]可访问的字段列表
field_maskString[]需要隐藏的字段列表

请求示例 #

创建管理员角色 #

PUT /_security/role/admin
{
  "cluster": ["*"],
  "indices": [
    {
      "names": ["*"],
      "privileges": ["*"]
    }
  ],
  "description": "拥有所有权限的管理员角色"
}

创建只读角色 #

PUT /_security/role/readonly_user
{
  "cluster": ["cluster:monitor/health"],
  "indices": [
    {
      "names": ["logs-*"],
      "field_security": ["timestamp", "message", "level"],
      "privileges": ["indices:data/read/search"]
    }
  ],
  "description": "只读访问日志索引,限制字段访问"
}

创建带文档级安全的角色 #

PUT /_security/role/department_manager
{
  "indices": [
    {
      "names": ["employee-*"],
      "query": "{\"term\": {\"department\": \"engineering\"}}",
      "privileges": ["READ_UT"]
    }
  ],
  "description": "只能查看工程部门的文档"
}

创建数据分析师角色 #

PUT /_security/role/data_analyst
{
  "cluster": ["cluster:monitor/health", "cluster:monitor/nodes/info"],
  "indices": [
    {
      "names": ["sales-*", "marketing-*"],
      "privileges": ["READ_UT", "indices:data/read/search"],
      "field_mask": ["salary", "ssn"]
    },
    {
      "names": ["reports-*"],
      "privileges": ["ALL"]
    }
  ],
  "description": "数据分析师角色,可访问销售和营销数据"
}

响应示例 #

创建成功(201 Created) #

{
  "status": "CREATED",
  "message": "'admin' created."
}

更新成功(200 OK) #

{
  "status": "OK",
  "message": "'data_analyst' updated."
}

错误响应 - 无效参数 #

{
  "error": {
    "root_causes": [
      {
        "type": "invalid_parameter_exception",
        "reason": "Invalid keys [unknownkey] found"
      }
    ],
    "type": "invalid_parameter_exception",
    "reason": "Invalid keys [unknownkey] found"
  },
  "status": 400
}

错误响应 - 权限不足 #

{
  "status": "FORBIDDEN",
  "message": "No permission to access REST API"
}

常用权限说明 #

集群级别权限 #

权限描述
"*""cluster:*"所有集群权限
"cluster:monitor/health"监控集群健康状态
"cluster:monitor/nodes/info"获取节点信息
"cluster:all"所有集群监控权限

索引级别权限 #

权限描述
"*""ALL"所有索引权限
"READ_UT"读取、查看和索引映射
"CRUD_UT"创建、读取、更新、删除
"indices:data/read/search"搜索权限
"indices:data/write/index"索引文档权限
"indices:admin/create"创建索引权限
"indices:admin/refresh"刷新索引权限

HTTP 状态码 #

状态码描述
200 OK角色更新成功
201 Created角色创建成功
400 Bad Request无效的请求体验证错误
401 Unauthorized身份验证失败
403 Forbidden权限不足
404 Not Found安全配置未初始化

注意事项 #

  1. 完全替换:更新角色时需要提供完整的角色定义(部分更新使用 PATCH)
  2. 角色名称:角色名称在 URL 路径中指定,而非请求体中
  3. 权限初始化:使用此 API 前必须先初始化安全配置
  4. 保留角色:只有超级管理员可以设置 reserved=true
  5. 字段掩码field_mask 中的字段将返回为 null
  6. 文档级安全query 参数使用查询 DSL 语法

相关操作 #

  • GET /_security/role:查询所有角色
  • GET /_security/role/{name}:查询指定角色
  • DELETE /_security/role/{name}:删除角色
  • PATCH /_security/role/{name}:部分更新角色

实现细节 #

  • 处理器RolesApiAction.java
  • 路由PUT /_security/role/{name}
  • 验证RolesValidator.java 验证请求参数
  • 配置存储:角色配置存储在安全配置索引中
  • 集群同步:配置更改会传播到所有集群节点