我正在使用spring应用程序进行POC,我正在尝试通过代理保护AWS kibana。我想只允许我登录的用户访问我的Kibana。
所以我只将IAM设置为ip,并且能够毫无问题地运行我的ES查询。现在我使用RESTTemplate类构建了一个类,其中我复制了一些必需的头文件并将请求推送到kibana。
我现在可以为登录用户加载kibana。但我无法从开发工具运行任何查询或显示任何仪表板。
我有一个索引数据库。
当我运行查询时
获取datacuts / datacuts / _search
我收到索引未找到错误。但同时如果只是说
获取数据库
我可以看到索引的映射详细信息。不知道这里发生了什么。
这是我写的代理代码
HttpHeaders headers = new HttpHeaders();
headers.add("Access-Control-Allow-Origin", "https://my-es-server"+restOfTheUrl);
headers.add("content-type", request.getContentType());
headers.add("kbn-version", "5.5.2");
HttpEntity<String> httpEntity = (body==null)?new HttpEntity<>(headers):
new HttpEntity<String>(body,headers);
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter());
ResponseEntity<String> resp = restTemplate.exchange(uri.toString(), HttpMethod.valueOf(request.getMethod()), httpEntity, String.class);
switch(resp.getHeaders().getContentType().getType()) {
case "text" :
String responseBody = resp.getBody().toString();
logger.debug("index count" + responseBody.indexOf("/_plugin/kibana"));
responseBody = responseBody.replaceAll("_plugin/kibana","myApp/_plugin/kibana");
return new ResponseEntity<String>(responseBody.toString(), resp.getHeaders(), HttpStatus.OK);
}
return resp;
失败的请求是
代理调用_plugin / kibana / api / console / proxy?path = datacuts%2Fdatacuts%2F_search&amp; method = GET在我得到响应的地方没有名称datacuts的索引。
我在这里做错了什么?
答案 0 :(得分:0)
添加正确的标题并检查内容类型可以解决我的问题。
我将以下代码添加到现有代码
headers.add(accessCtrl, url_to_host);
headers.add(connect, keepAlive);
headers.add(proxyConn, keepAlive);
headers.add(contentType, request.getContentType());
headers.add(kbn, kbnVerion);
headers.add(cluster , cluster_key);
request.setAttribute(presigned, false);
headers.add(host, host);
body=(body!=null && !body.equals(FieldNameConstant.BLANK) && "application/x-ndjson".equals(request.getContentType()))?body+"/n":body;
这解决了我的问题。现在我可以用spring实现一个完整的kibana java代理!