适用版本: 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. 排查方法 #
- 核对报错中对应字段的原始 JSON 结构,确认外层是否为
[]。 - 如果该角色定义由代码生成,检查序列化后是否把单个元素自动折叠成对象。
- 对比成功请求与失败请求的权限结构,通常很快就能看出外层数组是否丢失。
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()
);
}





