通过Java代理

时间:2018-04-04 16:23:48

标签: java spring-mvc elasticsearch kibana

我正在使用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的索引。

我在这里做错了什么?

1 个答案:

答案 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代理!