This is an automated email from the ASF dual-hosted git repository.
krisden pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git
The following commit(s) were added to refs/heads/master by this push:
new e90beea KNOX-1919 - Taking gateway.path into consideration when
processing redirectToUrl provider param with the OOTB knoxsso.xml sample (#113)
e90beea is described below
commit e90beeaa4624129de936991284f3caa6f67ac652
Author: Sandor Molnar <[email protected]>
AuthorDate: Wed Jul 10 18:44:55 2019 +0200
KNOX-1919 - Taking gateway.path into consideration when processing
redirectToUrl provider param with the OOTB knoxsso.xml sample (#113)
---
.../knox/gateway/filter/RedirectToUrlFilter.java | 22 ++++++--
.../gateway/filter/RedirectToUrlFilterTest.java | 61 ++++++++++++++++++++++
gateway-release/home/conf/topologies/knoxsso.xml | 2 +-
3 files changed, 79 insertions(+), 6 deletions(-)
diff --git
a/gateway-provider-security-shiro/src/main/java/org/apache/knox/gateway/filter/RedirectToUrlFilter.java
b/gateway-provider-security-shiro/src/main/java/org/apache/knox/gateway/filter/RedirectToUrlFilter.java
index f97984f..f0f14b3 100644
---
a/gateway-provider-security-shiro/src/main/java/org/apache/knox/gateway/filter/RedirectToUrlFilter.java
+++
b/gateway-provider-security-shiro/src/main/java/org/apache/knox/gateway/filter/RedirectToUrlFilter.java
@@ -18,35 +18,47 @@
package org.apache.knox.gateway.filter;
+import java.io.IOException;
+import java.util.regex.Pattern;
+
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+
+import org.apache.knox.gateway.config.GatewayConfig;
public class RedirectToUrlFilter extends AbstractGatewayFilter {
public static final String REDIRECT_TO_URL = "redirectToUrl";
+ private static final String GATEWAY_PATH_PLACEHOLDER = "${GATEWAY_PATH}";
- protected String redirectUrl;
+ private String redirectUrl;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
super.init(filterConfig);
redirectUrl = filterConfig.getInitParameter(REDIRECT_TO_URL);
+ if (redirectUrl != null && redirectUrl.contains(GATEWAY_PATH_PLACEHOLDER))
{
+ final GatewayConfig gatewayConfig = (GatewayConfig)
filterConfig.getServletContext().getAttribute(GatewayConfig.GATEWAY_CONFIG_ATTRIBUTE);
+ redirectUrl =
redirectUrl.replaceAll(Pattern.quote(GATEWAY_PATH_PLACEHOLDER),
gatewayConfig.getGatewayPath());
+ }
}
@Override
- protected void doFilter( HttpServletRequest request,
- HttpServletResponse response, FilterChain chain ) throws IOException,
ServletException {
+ protected void doFilter(HttpServletRequest request, HttpServletResponse
response, FilterChain chain) throws IOException, ServletException {
if (redirectUrl != null && request.getHeader("Authorization") == null) {
response.sendRedirect(redirectUrl + getOriginalQueryString(request));
}
- chain.doFilter( request, response );
+ chain.doFilter(request, response);
}
private String getOriginalQueryString(HttpServletRequest request) {
String originalQueryString = request.getQueryString();
return (originalQueryString == null) ? "" : "?" + originalQueryString;
}
+
+ String getRedirectUrl() {
+ return redirectUrl;
+ }
}
diff --git
a/gateway-provider-security-shiro/src/test/java/org/apache/knox/gateway/filter/RedirectToUrlFilterTest.java
b/gateway-provider-security-shiro/src/test/java/org/apache/knox/gateway/filter/RedirectToUrlFilterTest.java
new file mode 100644
index 0000000..efa2d78
--- /dev/null
+++
b/gateway-provider-security-shiro/src/test/java/org/apache/knox/gateway/filter/RedirectToUrlFilterTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.knox.gateway.filter;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.easymock.EasyMock;
+import org.junit.Test;
+
+public class RedirectToUrlFilterTest {
+
+ private static final String OUT_OF_THE_BOX_REDIRECT_TO_URL =
"/${GATEWAY_PATH}/knoxsso/knoxauth/login.html";
+ private static final String CUSTOM_REDIRECT_URL =
"/route/to/my/web/app/login/page";
+
+ @Test
+ public void shouldReplaceGatewayPathInRedirectUrl() throws Exception {
+ final String customGatewayPath = "customGatewayPath";
+ final RedirectToUrlFilter filter = new RedirectToUrlFilter();
+
filter.init(buildFilterConfigAndSetOtherMockExpectations(OUT_OF_THE_BOX_REDIRECT_TO_URL,
customGatewayPath));
+ assertEquals("/" + customGatewayPath + "/knoxsso/knoxauth/login.html",
filter.getRedirectUrl());
+ }
+
+ @Test
+ public void shouldNotTouchAlreadyCustomizedRedirectUrl() throws Exception {
+ final RedirectToUrlFilter filter = new RedirectToUrlFilter();
+
filter.init(buildFilterConfigAndSetOtherMockExpectations(CUSTOM_REDIRECT_URL,
""));
+ assertEquals(CUSTOM_REDIRECT_URL, filter.getRedirectUrl());
+ }
+
+ private FilterConfig buildFilterConfigAndSetOtherMockExpectations(String
redirectUrl, String customGatewayPath) {
+ final FilterConfig filterConfig =
EasyMock.createNiceMock(FilterConfig.class);
+
EasyMock.expect(filterConfig.getInitParameter(RedirectToUrlFilter.REDIRECT_TO_URL)).andReturn(redirectUrl);
+ final ServletContext servletContext =
EasyMock.createNiceMock(ServletContext.class);
+
EasyMock.expect(filterConfig.getServletContext()).andReturn(servletContext);
+ final GatewayConfig gatewayConfig =
EasyMock.createNiceMock(GatewayConfig.class);
+
EasyMock.expect(servletContext.getAttribute(GatewayConfig.GATEWAY_CONFIG_ATTRIBUTE)).andReturn(gatewayConfig);
+
EasyMock.expect(gatewayConfig.getGatewayPath()).andReturn(customGatewayPath);
+
+ EasyMock.replay(filterConfig, servletContext, gatewayConfig);
+ return filterConfig;
+ }
+}
diff --git a/gateway-release/home/conf/topologies/knoxsso.xml
b/gateway-release/home/conf/topologies/knoxsso.xml
index b4ac7b1..a679600 100644
--- a/gateway-release/home/conf/topologies/knoxsso.xml
+++ b/gateway-release/home/conf/topologies/knoxsso.xml
@@ -39,7 +39,7 @@
</param>
<param>
<name>redirectToUrl</name>
- <value>/gateway/knoxsso/knoxauth/login.html</value>
+ <value>/${GATEWAY_PATH}/knoxsso/knoxauth/login.html</value>
</param>
<param>
<name>restrictedCookies</name>