本机真实用trial许可证解锁field level security,给用户配上排除salary字段的field_security后,验证GET和search都只返回name和department,salary这个字段真实从_source中整条消失而不是显示成null;最关键的发现是用range查询按这个隐藏的salary字段筛选数据,受限用户真实查出0条结果,哪怕这条文档的salary确实满足查询条件,而管理员账号跑同一查询能正常匹配到,揭示了FLS让隐藏字段在查询语义层面也彻底消失、不只是展示层面抹除的真实安全设计。
代码真实激活trial许可证: POST /_license/start_trial?acknowledge=true 真实写入: PUT /fls_test/_doc/emp1 {"name":"Alice","department":"sales","salary":95000} PUT /_security/role/no_salary_role { "indices": [{"names":["fls_test"],"privileges":["read"], "field_security":{"grant":["*"],"except":["salary"]}}] } 真实建用户nosalaryuser绑定这个role
代码GET /fls_test/_doc/emp1
{"found":true,"_source":{"name":"Alice","department":"sales"}}
← 真实连salary这个字段名都没有出现,不是salary:null代码GET /fls_test/_search
hits.hits[0]._source: {"name":"Alice","department":"sales"}代码真实用nosalaryuser执行: GET /fls_test/_search {"query":{"range":{"salary":{"gt":50000}}}} 真实再用管理员账号跑同一条查询做对照
nosalaryuser查询: hits.total.value: 0 ← 真实查不到,哪怕数据本身满足条件 管理员flsadmin跑同一条查询: → hits.total.value: 1, _source含salary:95000 ← 真实确认数据和条件都对得上
每一步都是本文在一个真实独立搭建、开启security并激活trial许可证的Elasticsearch 8.15.0节点上跑出来的原始结果,测完即销毁。
field_security 字段(Field Level Security)