From f468160693ac64e9025de85215c70cbd92317afa Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Fri, 12 Dec 2014 11:31:26 +0000 Subject: [PATCH] Add auth.route.* for controlling OAuth2 token relay If user adds auth.route..scheme: passthru then instead of adding the bearer token the filter will not do anything (and the normal authorization header will be passed through to the backend) See gh-19 --- .travis.yml | 1 + .../cloud/netflix/zuul/ProxyRouteLocator.java | 5 ++++- .../cloud/netflix/zuul/ZuulProperties.java | 15 +++++++++++++++ .../zuul/filters/pre/PreDecorationFilter.java | 2 +- .../zuul/filters/route/RibbonRoutingFilter.java | 4 ++-- .../filters/route/SimpleHostRoutingFilter.java | 4 ++-- .../netflix/zuul/ProxyRouteLocatorTests.java | 5 +++-- .../filters/pre/PreDecorationFilterTests.java | 2 +- 8 files changed, 29 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index c538a813..ddbb3b5f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ +sudo: false language: java before_install: - git config user.name "$GIT_NAME" diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ProxyRouteLocator.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ProxyRouteLocator.java index b835a320..91afe00d 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ProxyRouteLocator.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ProxyRouteLocator.java @@ -72,11 +72,13 @@ public class ProxyRouteLocator { public ProxyRouteSpec getMatchingRoute(String path) { String location = null; String targetPath = null; + String id = null; String prefix = properties.getPrefix(); for (Entry entry : routes.get().entrySet()) { String pattern = entry.getKey(); if (pathMatcher.match(pattern, path)) { ZuulRoute route = entry.getValue(); + id = route.getId(); location = route.getLocation(); targetPath = path; if (path.startsWith(prefix) && properties.isStripPrefix()) { @@ -93,7 +95,7 @@ public class ProxyRouteLocator { break; } } - return location == null ? null : new ProxyRouteSpec(targetPath, location, prefix); + return location == null ? null : new ProxyRouteSpec(id, targetPath, location, prefix); } // Package access so ZuulHandlerMapping can reset it's mappings @@ -178,6 +180,7 @@ public class ProxyRouteLocator { @Data @AllArgsConstructor public static class ProxyRouteSpec { + private String id; private String path; private String location; private String prefix; diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProperties.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProperties.java index f7241bf9..f1975a3b 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProperties.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProperties.java @@ -32,6 +32,12 @@ public class ZuulProperties { if (!StringUtils.hasText(value.getLocation())) { value.serviceId = entry.getKey(); } + if (!StringUtils.hasText(value.getId())) { + value.id = entry.getKey(); + } + if (!StringUtils.hasText(value.getPath())) { + value.path = "/" + entry.getKey() + "/**"; + } } return this.routes; } @@ -40,6 +46,7 @@ public class ZuulProperties { @AllArgsConstructor @NoArgsConstructor public static class ZuulRoute { + private String id; private String path; private String serviceId; private String url; @@ -54,6 +61,7 @@ public class ZuulProperties { location = values[1]; path = values[0]; } + this.id = extractId(path); if (!path.startsWith("/")) { path = "/" + path; } @@ -62,6 +70,7 @@ public class ZuulProperties { } public ZuulRoute(String path, String location) { + this.id = extractId(path); this.path = path; setLocation(location); } @@ -82,6 +91,12 @@ public class ZuulProperties { serviceId = location; } } + + private String extractId(String path) { + path = path.startsWith("/") ? path.substring(1) : path; + path = path.replace("/*","").replace("*", ""); + return path; + } } } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilter.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilter.java index 39e4eeed..fddef686 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilter.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilter.java @@ -57,7 +57,7 @@ public class PreDecorationFilter extends ZuulFilter { if (location != null) { ctx.put("requestURI", route.getPath()); - ctx.put("proxy", true); + ctx.put("proxy", route.getId()); if (location.startsWith("http:") || location.startsWith("https:")) { ctx.setRouteHost(getUrl(location)); diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilter.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilter.java index 2aca9e29..d976d4fc 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilter.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilter.java @@ -315,7 +315,7 @@ public class RibbonRoutingFilter extends ZuulFilter { } for (String key : resp.getHeaders().keySet()) { - boolean isValidHeader = isValidHeader(key); + boolean isValidHeader = isIncludedHeader(key); Collection list = resp.getHeaders().get(key); for (String header : list) { context.addOriginResponseHeader(key, header); @@ -331,7 +331,7 @@ public class RibbonRoutingFilter extends ZuulFilter { } - boolean isValidHeader(String headerName) { + private boolean isIncludedHeader(String headerName) { switch (headerName.toLowerCase()) { case "connection": case "content-length": diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java index 67d8b014..4b32106f 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java @@ -299,7 +299,7 @@ public class SimpleHostRoutingFilter extends ZuulFilter { return requestEntity; } - boolean isValidHeader(String name) { + private boolean isIncludedHeader(String name) { if (name.toLowerCase().contains("content-length")) return false; if (!RequestContext.getCurrentContext().getResponseGZipped()) { @@ -316,7 +316,7 @@ public class SimpleHostRoutingFilter extends ZuulFilter { while (headerNames.hasMoreElements()) { String name = (String) headerNames.nextElement(); String value = request.getHeader(name); - if (isValidHeader(name)) + if (isIncludedHeader(name)) headers.add(new BasicHeader(name, value)); } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ProxyRouteLocatorTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ProxyRouteLocatorTests.java index e7d29c45..09455f09 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ProxyRouteLocatorTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ProxyRouteLocatorTests.java @@ -49,6 +49,7 @@ public class ProxyRouteLocatorTests { routeLocator.getRoutes(); // force refresh ProxyRouteSpec route = routeLocator.getMatchingRoute("/foo/1"); assertEquals("foo", route.getLocation()); + assertEquals("foo", route.getId()); } @Test @@ -65,7 +66,7 @@ public class ProxyRouteLocatorTests { @Test public void testGetMatchingPathWithNoPrefixStripping() throws Exception { ProxyRouteLocator routeLocator = new ProxyRouteLocator(this.discovery, this.properties); - this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**", "foo", null, false)); + this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false)); this.properties.setStripPrefix(false); this.properties.setPrefix("/proxy"); routeLocator.getRoutes(); // force refresh @@ -89,7 +90,7 @@ public class ProxyRouteLocatorTests { @Test public void testGetMatchingPathWithGlobalPrefixStripping() throws Exception { ProxyRouteLocator routeLocator = new ProxyRouteLocator(this.discovery, this.properties); - this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**", "foo", null, false)); + this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false)); this.properties.setPrefix("/proxy"); routeLocator.getRoutes(); // force refresh ProxyRouteSpec route = routeLocator.getMatchingRoute("/proxy/foo/1"); diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java index 5432d5e1..3d1aa453 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java @@ -55,7 +55,7 @@ public class PreDecorationFilterTests { properties.setPrefix("/api"); properties.setStripPrefix(true); request.setRequestURI("/api/foo/1"); - routeLocator.addRoute(new ZuulRoute("/foo/**", "foo", null, false)); + routeLocator.addRoute(new ZuulRoute("foo", "/foo/**", "foo", null, false)); filter.run(); RequestContext ctx = RequestContext.getCurrentContext(); assertEquals("/foo/1", ctx.get("requestURI"));