Elasticsearch专题精讲——API规范—— 基于 URL 的访问控制
API规范—— 基于 URL 的访问控制
https://www.elastic.co/guide/en/elasticsearch/reference/8.8/api-conventions.html#api-url-access-control
Elasticsearch 中的 multi-search(多搜索)、multi-get(多获取) 和 bulk(批量请求)是在一个请求中执行多个操作的方法。如果使用基于URL的访问控制代理来保护数据访问,那么 multi-search(多搜索)、multi-get(多获取) 和 bulk(批量请求)中,需要在URL和请求体中指定数据流或索引,才能保证请求被正确执行并访问到所需的数据。
例如,如果客户端想要一次请求获取多个索引的数据,那么就需要在URL中指定要获取数据的索引名称,同时还需要在每个请求的请求体中指明请求的具体操作及操作对应的索引名称。因此,对于数据非常庞大且涉及多个索引的情况,执行基于URL的访问控制就会变得非常困难。
我们举个例子:
假设客户端想要一次请求获取三个索引(index1、index2和index3)中所有文档的数据。根据基于URL的访问控制的实现方式,客户端需要向服务器发送三个请求,每个请求都需要指定索引名称,并在请求体中指定搜索操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | GET /index1/_search { "query" : { "match_all" : {} } } GET /index2/_search { "query" : { "match_all" : {} } } GET /index3/_search { "query" : { "match_all" : {} } } |
这种实现方式很容易导致重复的请求,因为每个请求都需要指定索引名称。此外,这样的做法还需要客户端发送多个请求,导致服务器负载较大。
为了减轻这种情况下的负担,建议通过使用单个索引名称,并使用多查询语句(multi-query)来执行基于URL的访问控制。这意味着客户端可以在单个请求中指定一个或多个查询,并指定与查询关联的索引名称。例如:
1 2 3 4 5 6 7 8 9 10 | POST /_msearch {} { "index" : "index1" } { "query" : { "match_all" : {}}} {} { "index" : "index2" } { "query" : { "match_all" : {}}} {} { "index" : "index3" } { "query" : { "match_all" : {}}} |
为了克服这种困难,用户可以使用其他方法,例如快速启动和关闭数据流或每个请求使用单个索引名称来提高数据访问的效率并简化基于URL的访问控制。
此外,还可以考虑优化数据流。如果客户端只需要一部分结果,就可以使用分片(shard)和滚动(scrolling)来减小数据量,并且仅获取必要的数据。可以使用滚动作为一种优化策略,来提升基于URL的访问控制的效率。
要防止用户重写 URL 中指定的数据流或索引,请在 elasticsearch.yml 中将 rest.action.multi.allow_display_index 设置为 false:
1 | rest.action.multi.allow_display_index: false |
需要注意的是,该选项的默认值是 true,这意味着用户可以在 URL 中自定义显示的索引。如果你将其设置为 false,则 Elasticsearch 在 URL 中忽略显示的索引,并将只考虑实际请求中指定的索引,从而确保安全性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2022-05-30 Go从入门到精通——结构体(struct)——示例:使用匿名结构体分离 JSON 数据
2022-05-30 Go从入门到精通——结构体(struct)——类型内嵌和结构体内嵌
2022-05-30 Go从入门到精通——结构体(struct)——示例:使用事件系统实现事件的响应和处理
2022-05-30 Go从入门到精通——结构体——为类型添加方法
2022-05-30 Go从入门到精通——结构体(struct)——示例:二维矢量模拟玩家移动
2022-05-30 Go语言从入门到精通——结构体(struct)——方法