9 changed files with 386 additions and 42 deletions
@ -0,0 +1,43 @@
@@ -0,0 +1,43 @@
|
||||
/* |
||||
* Copyright 2012-2018 the original author or authors. |
||||
* |
||||
* Licensed 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.springframework.boot.autoconfigure.security.servlet; |
||||
|
||||
import org.springframework.boot.autoconfigure.web.servlet.JerseyApplicationPath; |
||||
import org.springframework.security.web.util.matcher.AntPathRequestMatcher; |
||||
import org.springframework.security.web.util.matcher.RequestMatcher; |
||||
|
||||
/** |
||||
* {@link RequestMatcherProvider} that provides an {@link AntPathRequestMatcher} that can |
||||
* be used for Jersey applications. |
||||
* |
||||
* @author Madhura Bhave |
||||
* @since 2.0.7 |
||||
*/ |
||||
public class JerseyRequestMatcherProvider implements RequestMatcherProvider { |
||||
|
||||
private final JerseyApplicationPath jerseyApplicationPath; |
||||
|
||||
public JerseyRequestMatcherProvider(JerseyApplicationPath jerseyApplicationPath) { |
||||
this.jerseyApplicationPath = jerseyApplicationPath; |
||||
} |
||||
|
||||
@Override |
||||
public RequestMatcher getRequestMatcher(String pattern) { |
||||
return new AntPathRequestMatcher( |
||||
this.jerseyApplicationPath.getRelativePath(pattern)); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,89 @@
@@ -0,0 +1,89 @@
|
||||
/* |
||||
* Copyright 2012-2018 the original author or authors. |
||||
* |
||||
* Licensed 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.springframework.boot.autoconfigure.web.servlet; |
||||
|
||||
import org.springframework.boot.web.servlet.ServletRegistrationBean; |
||||
|
||||
/** |
||||
* Interface that can be used by auto-configurations that need path details Jersey's |
||||
* application path that serves as the base URI for the application. |
||||
* |
||||
* @author Madhura Bhave |
||||
* @since 2.0.7 |
||||
*/ |
||||
@FunctionalInterface |
||||
public interface JerseyApplicationPath { |
||||
|
||||
/** |
||||
* Returns the configured path of the application. |
||||
* @return the configured path |
||||
*/ |
||||
String getPath(); |
||||
|
||||
/** |
||||
* Return a form of the given path that's relative to the Jersey application path. |
||||
* @param path the path to make relative |
||||
* @return the relative path |
||||
*/ |
||||
default String getRelativePath(String path) { |
||||
String prefix = getPrefix(); |
||||
if (!path.startsWith("/")) { |
||||
path = "/" + path; |
||||
} |
||||
return prefix + path; |
||||
} |
||||
|
||||
/** |
||||
* Return a cleaned up version of the path that can be used as a prefix for URLs. The |
||||
* resulting path will have path will not have a trailing slash. |
||||
* @return the prefix |
||||
* @see #getRelativePath(String) |
||||
*/ |
||||
default String getPrefix() { |
||||
String result = getPath(); |
||||
int index = result.indexOf('*'); |
||||
if (index != -1) { |
||||
result = result.substring(0, index); |
||||
} |
||||
if (result.endsWith("/")) { |
||||
result = result.substring(0, result.length() - 1); |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* Return a URL mapping pattern that can be used with a |
||||
* {@link ServletRegistrationBean} to map Jersey's servlet. |
||||
* @return the path as a servlet URL mapping |
||||
*/ |
||||
default String getUrlMapping() { |
||||
String path = getPath(); |
||||
if (!path.startsWith("/")) { |
||||
path = "/" + path; |
||||
} |
||||
if (path.equals("/")) { |
||||
return "/*"; |
||||
} |
||||
if (path.contains("*")) { |
||||
return path; |
||||
} |
||||
if (path.endsWith("/")) { |
||||
return path + "*"; |
||||
} |
||||
return path + "/*"; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,93 @@
@@ -0,0 +1,93 @@
|
||||
/* |
||||
* Copyright 2012-2018 the original author or authors. |
||||
* |
||||
* Licensed 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.springframework.boot.autoconfigure.web.servlet; |
||||
|
||||
import org.junit.Test; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
/** |
||||
* Tests for {@link JerseyApplicationPath}. |
||||
* |
||||
* @author Madhura Bhave |
||||
*/ |
||||
public class JerseyApplicationPathTests { |
||||
|
||||
@Test |
||||
public void getRelativePathReturnsRelativePath() { |
||||
assertThat(((JerseyApplicationPath) () -> "spring").getRelativePath("boot")) |
||||
.isEqualTo("spring/boot"); |
||||
assertThat(((JerseyApplicationPath) () -> "spring/").getRelativePath("boot")) |
||||
.isEqualTo("spring/boot"); |
||||
assertThat(((JerseyApplicationPath) () -> "spring").getRelativePath("/boot")) |
||||
.isEqualTo("spring/boot"); |
||||
assertThat(((JerseyApplicationPath) () -> "spring/*").getRelativePath("/boot")) |
||||
.isEqualTo("spring/boot"); |
||||
} |
||||
|
||||
@Test |
||||
public void getPrefixWhenHasSimplePathReturnPath() { |
||||
assertThat(((JerseyApplicationPath) () -> "spring").getPrefix()) |
||||
.isEqualTo("spring"); |
||||
} |
||||
|
||||
@Test |
||||
public void getPrefixWhenHasPatternRemovesPattern() { |
||||
assertThat(((JerseyApplicationPath) () -> "spring/*.do").getPrefix()) |
||||
.isEqualTo("spring"); |
||||
} |
||||
|
||||
@Test |
||||
public void getPrefixWhenPathEndsWithSlashRemovesSlash() { |
||||
assertThat(((JerseyApplicationPath) () -> "spring/").getPrefix()) |
||||
.isEqualTo("spring"); |
||||
} |
||||
|
||||
@Test |
||||
public void getUrlMappingWhenPathIsEmptyReturnsSlash() { |
||||
assertThat(((JerseyApplicationPath) () -> "").getUrlMapping()).isEqualTo("/*"); |
||||
} |
||||
|
||||
@Test |
||||
public void getUrlMappingWhenPathIsSlashReturnsSlash() { |
||||
assertThat(((JerseyApplicationPath) () -> "/").getUrlMapping()).isEqualTo("/*"); |
||||
} |
||||
|
||||
@Test |
||||
public void getUrlMappingWhenPathContainsStarReturnsPath() { |
||||
assertThat(((JerseyApplicationPath) () -> "/spring/*.do").getUrlMapping()) |
||||
.isEqualTo("/spring/*.do"); |
||||
} |
||||
|
||||
@Test |
||||
public void getUrlMappingWhenHasPathNotEndingSlashReturnsSlashStarPattern() { |
||||
assertThat(((JerseyApplicationPath) () -> "/spring/boot").getUrlMapping()) |
||||
.isEqualTo("/spring/boot/*"); |
||||
} |
||||
|
||||
@Test |
||||
public void getUrlMappingWhenHasPathDoesNotStartWithSlashPrependsSlash() { |
||||
assertThat(((JerseyApplicationPath) () -> "spring/boot").getUrlMapping()) |
||||
.isEqualTo("/spring/boot/*"); |
||||
} |
||||
|
||||
@Test |
||||
public void getUrlMappingWhenHasPathEndingWithSlashReturnsSlashStarPattern() { |
||||
assertThat(((JerseyApplicationPath) () -> "/spring/boot/").getUrlMapping()) |
||||
.isEqualTo("/spring/boot/*"); |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue