7 changed files with 234 additions and 29 deletions
@ -0,0 +1,82 @@
@@ -0,0 +1,82 @@
|
||||
/* |
||||
* 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 javax.servlet.http.HttpServletRequest; |
||||
|
||||
import org.springframework.boot.autoconfigure.h2.H2ConsoleProperties; |
||||
import org.springframework.boot.autoconfigure.security.StaticResourceLocation; |
||||
import org.springframework.boot.security.servlet.ApplicationContextRequestMatcher; |
||||
import org.springframework.security.web.util.matcher.AntPathRequestMatcher; |
||||
import org.springframework.security.web.util.matcher.RequestMatcher; |
||||
|
||||
/** |
||||
* Factory that can be used to create a {@link RequestMatcher} for commonly used paths. |
||||
* |
||||
* @author Madhura Bhave |
||||
* @author Phillip Webb |
||||
* @since 2.0.0 |
||||
*/ |
||||
public final class PathRequest { |
||||
|
||||
private PathRequest() { |
||||
} |
||||
|
||||
/** |
||||
* Returns a {@link StaticResourceRequest} that can be used to create a matcher for |
||||
* {@link StaticResourceLocation Locations}. |
||||
* @return a {@link StaticResourceRequest} |
||||
*/ |
||||
public static StaticResourceRequest toStaticResources() { |
||||
return StaticResourceRequest.get(); |
||||
} |
||||
|
||||
/** |
||||
* Returns a matcher that includes the H2 console location. For example: <pre class="code"> |
||||
* PathRequest.toH2Console() |
||||
* </pre> |
||||
* @return the configured {@link RequestMatcher} |
||||
*/ |
||||
public static H2ConsoleRequestMatcher toH2Console() { |
||||
return new H2ConsoleRequestMatcher(); |
||||
} |
||||
|
||||
/** |
||||
* The request matcher used to match against h2 console path. |
||||
*/ |
||||
public static final class H2ConsoleRequestMatcher |
||||
extends ApplicationContextRequestMatcher<H2ConsoleProperties> { |
||||
|
||||
private RequestMatcher delegate; |
||||
|
||||
private H2ConsoleRequestMatcher() { |
||||
super(H2ConsoleProperties.class); |
||||
} |
||||
|
||||
@Override |
||||
protected void initialized(H2ConsoleProperties h2ConsoleProperties) { |
||||
this.delegate = new AntPathRequestMatcher(h2ConsoleProperties.getPath()); |
||||
} |
||||
|
||||
@Override |
||||
protected boolean matches(HttpServletRequest request, H2ConsoleProperties context) { |
||||
return this.delegate.matches(request); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,112 @@
@@ -0,0 +1,112 @@
|
||||
/* |
||||
* 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 javax.servlet.http.HttpServletRequest; |
||||
|
||||
import org.assertj.core.api.AssertDelegateTarget; |
||||
import org.junit.Rule; |
||||
import org.junit.Test; |
||||
import org.junit.rules.ExpectedException; |
||||
|
||||
import org.springframework.boot.autoconfigure.web.ServerProperties; |
||||
import org.springframework.mock.web.MockHttpServletRequest; |
||||
import org.springframework.mock.web.MockServletContext; |
||||
import org.springframework.security.web.util.matcher.RequestMatcher; |
||||
import org.springframework.web.context.WebApplicationContext; |
||||
import org.springframework.web.context.support.StaticWebApplicationContext; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
/** |
||||
* Tests for {@link PathRequest}. |
||||
* |
||||
* @author Madhura Bhave |
||||
*/ |
||||
public class PathRequestTests { |
||||
|
||||
@Rule |
||||
public ExpectedException thrown = ExpectedException.none(); |
||||
|
||||
@Test |
||||
public void toStaticResourcesShouldReturnStaticResourceRequest() { |
||||
assertThat(PathRequest.toStaticResources()).isInstanceOf(StaticResourceRequest.class); |
||||
} |
||||
|
||||
@Test |
||||
public void toH2ConsoleShouldMatchH2ConsolePath() { |
||||
RequestMatcher matcher = PathRequest.toH2Console(); |
||||
assertMatcher(matcher).matches("/h2-console"); |
||||
assertMatcher(matcher).doesNotMatch("/js/file.js"); |
||||
} |
||||
|
||||
private RequestMatcherAssert assertMatcher(RequestMatcher matcher) { |
||||
StaticWebApplicationContext context = new StaticWebApplicationContext(); |
||||
context.registerBean(ServerProperties.class); |
||||
return assertThat(new RequestMatcherAssert(context, matcher)); |
||||
} |
||||
|
||||
private static class RequestMatcherAssert implements AssertDelegateTarget { |
||||
|
||||
private final WebApplicationContext context; |
||||
|
||||
private final RequestMatcher matcher; |
||||
|
||||
RequestMatcherAssert(WebApplicationContext context, RequestMatcher matcher) { |
||||
this.context = context; |
||||
this.matcher = matcher; |
||||
} |
||||
|
||||
public void matches(String path) { |
||||
matches(mockRequest(path)); |
||||
} |
||||
|
||||
private void matches(HttpServletRequest request) { |
||||
assertThat(this.matcher.matches(request)) |
||||
.as("Matches " + getRequestPath(request)).isTrue(); |
||||
} |
||||
|
||||
public void doesNotMatch(String path) { |
||||
doesNotMatch(mockRequest(path)); |
||||
} |
||||
|
||||
private void doesNotMatch(HttpServletRequest request) { |
||||
assertThat(this.matcher.matches(request)) |
||||
.as("Does not match " + getRequestPath(request)).isFalse(); |
||||
} |
||||
|
||||
private MockHttpServletRequest mockRequest(String path) { |
||||
MockServletContext servletContext = new MockServletContext(); |
||||
servletContext.setAttribute( |
||||
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, |
||||
this.context); |
||||
MockHttpServletRequest request = new MockHttpServletRequest(servletContext); |
||||
request.setPathInfo(path); |
||||
return request; |
||||
} |
||||
|
||||
private String getRequestPath(HttpServletRequest request) { |
||||
String url = request.getServletPath(); |
||||
if (request.getPathInfo() != null) { |
||||
url += request.getPathInfo(); |
||||
} |
||||
return url; |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue