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

适用版本: 6.8-8.x

1. 错误说明 #

报错 failed to parse application privileges for role [<role>]. expected field [<field>] value to be an array; but found [<token>] instead 表示角色定义中的应用权限字段类型不正确。

根据日志上下文,Elasticsearch 期望这个字段是数组,然后再逐个读取数组中的权限对象。如果你直接传了对象、字符串或 null,解析会在进入数组前失败。

2. 常见触发场景 #

  • applications 配成单个对象,而不是对象数组。
  • 自动生成配置时,为单条权限省略了数组包装层。
  • YAML 到 JSON 转换后,列表结构被错误压平成映射对象。

错误示例:

{
  "applications": {
    "application": "kibana-.kibana",
    "resources": ["space:default"],
    "privileges": ["read"]
  }
}

3. 排查方法 #

  1. 核对报错中对应字段的原始 JSON 结构,确认外层是否为 []
  2. 如果该角色定义由代码生成,检查序列化后是否把单个元素自动折叠成对象。
  3. 对比成功请求与失败请求的权限结构,通常很快就能看出外层数组是否丢失。

4. 修复方法 #

  • 将该字段改为数组。
  • 即使只有一条应用权限,也要用数组包裹。

修正示例:

{
  "applications": [
    {
      "application": "kibana-.kibana",
      "resources": ["space:default"],
      "privileges": ["read"]
    }
  ]
}

5. 预防建议 #

  • 对角色 JSON 做结构化校验,明确区分“对象字段”和“对象数组字段”。
  • 在配置发布流程中保留最终请求体样例,减少模板和序列化带来的结构偏差。
  • 为单权限场景补一条自动化测试,防止“单元素数组被折叠”再次出现。

相关错误 #

附:日志上下文 #

private static ApplicationResourcePrivileges[] parseApplicationPrivileges(String roleName, XContentParser parser) throws IOException {
    if (parser.currentToken() != XContentParser.Token.START_ARRAY) {
        throw new ElasticsearchParseException(
            "failed to parse application privileges for role [{}]. expected field [{}] value "
                + "to be an array; but found [{}] instead",
            roleName,
            parser.currentName(),
            parser.currentToken()
        );
    }