适用版本: 6.8-8.x
1. 错误说明 #
报错 failed to parse indices privileges for role [<role>]. [<field>] cannot be an empty array 表示 Elasticsearch 在解析角色的索引权限时,发现某个本应包含至少一个值的字段被配置成了空数组。
从附录代码可以看到,解析器允许该字段是字符串,或者是字符串数组;但如果数组长度为 0,就会直接抛出异常。
2. 常见触发场景 #
- 在角色定义里把
names写成[]。 - 用模板生成角色 JSON 时,目标索引列表为空,但模板仍然输出了空数组。
- 用脚本拼装
privileges、granted_fields等数组时,提前过滤后没有剩余元素。
错误示例:
{
"indices": [
{
"names": [],
"privileges": ["read"]
}
]
}
3. 排查方法 #
- 查看异常里的
role和字段名,确认是哪个索引权限块解析失败。 - 检查该字段最终发送给 Elasticsearch 的 JSON,确认是否真的是空数组。
- 如果角色由程序或模板生成,追查生成前的原始输入,确认是不是上游过滤把所有值都清空了。
- 同时确认该字段是否允许单值字符串写法,必要时改成字符串而不是数组。
4. 修复方法 #
- 为该字段至少提供一个有效值。
- 如果没有任何值可配置,就不要输出这个权限块,或在上游直接阻止提交。
- 对角色模板增加非空校验,避免空数组进入安全配置。
修正示例:
{
"indices": [
{
"names": ["logs-*"],
"privileges": ["read"]
}
]
}
5. 预防建议 #
- 对角色定义中的数组字段统一做最小长度校验。
- 模板渲染后保留最终 JSON 日志,便于快速定位是哪一步生成了空数组。
- 将常见角色配置纳入自动化测试,覆盖“空数组”“空字符串”“字段缺失”等边界场景。
相关错误 #
附:日志上下文 #
if (token == XContentParser.Token.VALUE_STRING) {
names = new String[]{parser.text()};
} else if (token == XContentParser.Token.START_ARRAY) {
names = readStringArray(roleName; parser; false);
if (names.length == 0) {
throw new ElasticsearchParseException("failed to parse indices privileges for role [{}]. [{}] cannot be an empty " +
"array"; roleName; currentFieldName);
}
} else {
throw new ElasticsearchParseException("failed to parse indices privileges for role [{}]. expected field [{}] " +
"value to be a string or an array of strings; but found [{}] instead"; roleName; currentFieldName; token);





