From d067ab5a27f885d95a21bb490be342602fbb626a Mon Sep 17 00:00:00 2001 From: Tomas Langer Date: Wed, 16 Sep 2020 15:53:08 +0200 Subject: [PATCH] Added support for remote host and port to jersey and security. Signed-off-by: Tomas Langer --- .../jersey/SecurityFilterCommon.java | 22 +++++++++++++------ .../webserver/jersey/JerseySupport.java | 10 ++++++++- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/security/integration/jersey/src/main/java/io/helidon/security/integration/jersey/SecurityFilterCommon.java b/security/integration/jersey/src/main/java/io/helidon/security/integration/jersey/SecurityFilterCommon.java index 54042d6c299..1bf1b05bce5 100644 --- a/security/integration/jersey/src/main/java/io/helidon/security/integration/jersey/SecurityFilterCommon.java +++ b/security/integration/jersey/src/main/java/io/helidon/security/integration/jersey/SecurityFilterCommon.java @@ -76,10 +76,6 @@ protected void doFilter(ContainerRequestContext request, SecurityContext securit return; } - // The following two lines are not possible in JAX-RS or Jersey - we would have to touch - // underlying web server's request... - //.addAttribute("userIp", req.remoteAddress()) - //.addAttribute("userPort", req.remotePort()) URI requestUri = request.getUriInfo().getRequestUri(); String query = requestUri.getQuery(); String origRequest; @@ -91,13 +87,25 @@ protected void doFilter(ContainerRequestContext request, SecurityContext securit Map> allHeaders = new HashMap<>(filterContext.getHeaders()); allHeaders.put(Security.HEADER_ORIG_URI, List.of(origRequest)); - SecurityEnvironment env = SecurityEnvironment.builder(security.serverTime()) + SecurityEnvironment.Builder envBuilder = SecurityEnvironment.builder(security.serverTime()) .path(filterContext.getResourcePath()) .targetUri(filterContext.getTargetUri()) .method(filterContext.getMethod()) .headers(allHeaders) - .addAttribute("resourceType", filterContext.getResourceName()) - .build(); + .addAttribute("resourceType", filterContext.getResourceName()); + + // The following two lines are not possible in JAX-RS or Jersey - we would have to touch + // underlying web server's request... + String remoteHost = (String) request.getProperty("io.helidon.jaxrs.remote-host"); + Integer remotePort = (Integer) request.getProperty("io.helidon.jaxrs.remote-port"); + if (remoteHost != null) { + envBuilder.addAttribute("userIp", remoteHost); + } + if (remotePort != null) { + envBuilder.addAttribute("userPort", remotePort); + } + + SecurityEnvironment env = envBuilder.build(); EndpointConfig ec = EndpointConfig.builder() .securityLevels(filterContext.getMethodSecurity().getSecurityLevels()) diff --git a/webserver/jersey/src/main/java/io/helidon/webserver/jersey/JerseySupport.java b/webserver/jersey/src/main/java/io/helidon/webserver/jersey/JerseySupport.java index 85a4c03ff73..56da4cad271 100644 --- a/webserver/jersey/src/main/java/io/helidon/webserver/jersey/JerseySupport.java +++ b/webserver/jersey/src/main/java/io/helidon/webserver/jersey/JerseySupport.java @@ -258,10 +258,18 @@ private void doAccept(ServerRequest req, ServerResponse res) { requestUri(req), req.method().name(), new WebServerSecurityContext(), - new WebServerPropertiesDelegate(req)); + new WebServerPropertiesDelegate(req), + null); // set headers req.headers().toMap().forEach(requestContext::headers); + // set remote address + String remoteHost = req.remoteAddress(); + int remotePort = req.remotePort(); + + requestContext.setProperty("io.helidon.jaxrs.remote-host", remoteHost); + requestContext.setProperty("io.helidon.jaxrs.remote-port", remotePort); + requestContext.setWriter(responseWriter); req.content()