|
|
|
@ -16,15 +16,13 @@ |
|
|
|
|
|
|
|
|
|
|
|
package org.springframework.security.web.access.intercept; |
|
|
|
package org.springframework.security.web.access.intercept; |
|
|
|
|
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.*; |
|
|
|
|
|
|
|
import static org.mockito.Mockito.mock; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.Collection; |
|
|
|
import java.util.Collection; |
|
|
|
import java.util.LinkedHashMap; |
|
|
|
import java.util.LinkedHashMap; |
|
|
|
|
|
|
|
|
|
|
|
import javax.servlet.FilterChain; |
|
|
|
import javax.servlet.FilterChain; |
|
|
|
|
|
|
|
|
|
|
|
import org.junit.Test; |
|
|
|
import org.junit.Test; |
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.mock.web.MockHttpServletRequest; |
|
|
|
import org.springframework.mock.web.MockHttpServletRequest; |
|
|
|
import org.springframework.mock.web.MockHttpServletResponse; |
|
|
|
import org.springframework.mock.web.MockHttpServletResponse; |
|
|
|
import org.springframework.security.access.ConfigAttribute; |
|
|
|
import org.springframework.security.access.ConfigAttribute; |
|
|
|
@ -33,6 +31,9 @@ import org.springframework.security.web.FilterInvocation; |
|
|
|
import org.springframework.security.web.util.matcher.AntPathRequestMatcher; |
|
|
|
import org.springframework.security.web.util.matcher.AntPathRequestMatcher; |
|
|
|
import org.springframework.security.web.util.matcher.RequestMatcher; |
|
|
|
import org.springframework.security.web.util.matcher.RequestMatcher; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat; |
|
|
|
|
|
|
|
import static org.mockito.Mockito.mock; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Tests {@link DefaultFilterInvocationSecurityMetadataSource}. |
|
|
|
* Tests {@link DefaultFilterInvocationSecurityMetadataSource}. |
|
|
|
* |
|
|
|
* |
|
|
|
@ -46,18 +47,18 @@ public class DefaultFilterInvocationSecurityMetadataSourceTests { |
|
|
|
// ========================================================================================================
|
|
|
|
// ========================================================================================================
|
|
|
|
private void createFids(String pattern, String method) { |
|
|
|
private void createFids(String pattern, String method) { |
|
|
|
LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>> requestMap = new LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>>(); |
|
|
|
LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>> requestMap = new LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>>(); |
|
|
|
requestMap.put(new AntPathRequestMatcher(pattern, method), def); |
|
|
|
requestMap.put(new AntPathRequestMatcher(pattern, method), this.def); |
|
|
|
fids = new DefaultFilterInvocationSecurityMetadataSource(requestMap); |
|
|
|
this.fids = new DefaultFilterInvocationSecurityMetadataSource(requestMap); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void lookupNotRequiringExactMatchSucceedsIfNotMatching() { |
|
|
|
public void lookupNotRequiringExactMatchSucceedsIfNotMatching() { |
|
|
|
createFids("/secure/super/**", null); |
|
|
|
createFids("/secure/super/**", null); |
|
|
|
|
|
|
|
|
|
|
|
FilterInvocation fi = createFilterInvocation("/SeCuRE/super/somefile.html", null, |
|
|
|
FilterInvocation fi = createFilterInvocation("/secure/super/somefile.html", null, |
|
|
|
null, null); |
|
|
|
null, null); |
|
|
|
|
|
|
|
|
|
|
|
assertThat(fids.getAttributes(fi)).isEqualTo(def); |
|
|
|
assertThat(this.fids.getAttributes(fi)).isEqualTo(this.def); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -66,13 +67,13 @@ public class DefaultFilterInvocationSecurityMetadataSourceTests { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void lookupNotRequiringExactMatchSucceedsIfSecureUrlPathContainsUpperCase() { |
|
|
|
public void lookupNotRequiringExactMatchSucceedsIfSecureUrlPathContainsUpperCase() { |
|
|
|
createFids("/SeCuRE/super/**", null); |
|
|
|
createFids("/secure/super/**", null); |
|
|
|
|
|
|
|
|
|
|
|
FilterInvocation fi = createFilterInvocation("/secure", "/super/somefile.html", |
|
|
|
FilterInvocation fi = createFilterInvocation("/secure", "/super/somefile.html", |
|
|
|
null, null); |
|
|
|
null, null); |
|
|
|
|
|
|
|
|
|
|
|
Collection<ConfigAttribute> response = fids.getAttributes(fi); |
|
|
|
Collection<ConfigAttribute> response = this.fids.getAttributes(fi); |
|
|
|
assertThat(response).isEqualTo(def); |
|
|
|
assertThat(response).isEqualTo(this.def); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
@ -82,8 +83,8 @@ public class DefaultFilterInvocationSecurityMetadataSourceTests { |
|
|
|
FilterInvocation fi = createFilterInvocation("/SeCurE/super/somefile.html", null, |
|
|
|
FilterInvocation fi = createFilterInvocation("/SeCurE/super/somefile.html", null, |
|
|
|
null, null); |
|
|
|
null, null); |
|
|
|
|
|
|
|
|
|
|
|
Collection<ConfigAttribute> response = fids.getAttributes(fi); |
|
|
|
Collection<ConfigAttribute> response = this.fids.getAttributes(fi); |
|
|
|
assertThat(response).isEqualTo(def); |
|
|
|
assertThat(response).isEqualTo(this.def); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
@ -93,8 +94,9 @@ public class DefaultFilterInvocationSecurityMetadataSourceTests { |
|
|
|
FilterInvocation fi = createFilterInvocation("/someAdminPage.html", null, |
|
|
|
FilterInvocation fi = createFilterInvocation("/someAdminPage.html", null, |
|
|
|
"a=/test", null); |
|
|
|
"a=/test", null); |
|
|
|
|
|
|
|
|
|
|
|
Collection<ConfigAttribute> response = fids.getAttributes(fi); |
|
|
|
Collection<ConfigAttribute> response = this.fids.getAttributes(fi); |
|
|
|
assertThat(response); // see SEC-161 (it should truncate after ? sign).isEqualTo(def)
|
|
|
|
assertThat(response); // see SEC-161 (it should truncate after ?
|
|
|
|
|
|
|
|
// sign).isEqualTo(def)
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test(expected = IllegalArgumentException.class) |
|
|
|
@Test(expected = IllegalArgumentException.class) |
|
|
|
@ -107,8 +109,8 @@ public class DefaultFilterInvocationSecurityMetadataSourceTests { |
|
|
|
createFids("/somepage**", "GET"); |
|
|
|
createFids("/somepage**", "GET"); |
|
|
|
|
|
|
|
|
|
|
|
FilterInvocation fi = createFilterInvocation("/somepage", null, null, "GET"); |
|
|
|
FilterInvocation fi = createFilterInvocation("/somepage", null, null, "GET"); |
|
|
|
Collection<ConfigAttribute> attrs = fids.getAttributes(fi); |
|
|
|
Collection<ConfigAttribute> attrs = this.fids.getAttributes(fi); |
|
|
|
assertThat(attrs).isEqualTo(def); |
|
|
|
assertThat(attrs).isEqualTo(this.def); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
@ -116,8 +118,8 @@ public class DefaultFilterInvocationSecurityMetadataSourceTests { |
|
|
|
createFids("/somepage**", null); |
|
|
|
createFids("/somepage**", null); |
|
|
|
|
|
|
|
|
|
|
|
FilterInvocation fi = createFilterInvocation("/somepage", null, null, "GET"); |
|
|
|
FilterInvocation fi = createFilterInvocation("/somepage", null, null, "GET"); |
|
|
|
Collection<ConfigAttribute> attrs = fids.getAttributes(fi); |
|
|
|
Collection<ConfigAttribute> attrs = this.fids.getAttributes(fi); |
|
|
|
assertThat(attrs).isEqualTo(def); |
|
|
|
assertThat(attrs).isEqualTo(this.def); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
@ -125,7 +127,7 @@ public class DefaultFilterInvocationSecurityMetadataSourceTests { |
|
|
|
createFids("/somepage**", "GET"); |
|
|
|
createFids("/somepage**", "GET"); |
|
|
|
|
|
|
|
|
|
|
|
FilterInvocation fi = createFilterInvocation("/somepage", null, null, "POST"); |
|
|
|
FilterInvocation fi = createFilterInvocation("/somepage", null, null, "POST"); |
|
|
|
Collection<ConfigAttribute> attrs = fids.getAttributes(fi); |
|
|
|
Collection<ConfigAttribute> attrs = this.fids.getAttributes(fi); |
|
|
|
assertThat(attrs).isNull(); |
|
|
|
assertThat(attrs).isNull(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -138,10 +140,10 @@ public class DefaultFilterInvocationSecurityMetadataSourceTests { |
|
|
|
requestMap.put(new AntPathRequestMatcher("/user/**", null), userAttrs); |
|
|
|
requestMap.put(new AntPathRequestMatcher("/user/**", null), userAttrs); |
|
|
|
requestMap.put(new AntPathRequestMatcher("/teller/**", "GET"), |
|
|
|
requestMap.put(new AntPathRequestMatcher("/teller/**", "GET"), |
|
|
|
SecurityConfig.createList("B")); |
|
|
|
SecurityConfig.createList("B")); |
|
|
|
fids = new DefaultFilterInvocationSecurityMetadataSource(requestMap); |
|
|
|
this.fids = new DefaultFilterInvocationSecurityMetadataSource(requestMap); |
|
|
|
|
|
|
|
|
|
|
|
FilterInvocation fi = createFilterInvocation("/user", null, null, "GET"); |
|
|
|
FilterInvocation fi = createFilterInvocation("/user", null, null, "GET"); |
|
|
|
Collection<ConfigAttribute> attrs = fids.getAttributes(fi); |
|
|
|
Collection<ConfigAttribute> attrs = this.fids.getAttributes(fi); |
|
|
|
assertThat(attrs).isEqualTo(userAttrs); |
|
|
|
assertThat(attrs).isEqualTo(userAttrs); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -155,13 +157,13 @@ public class DefaultFilterInvocationSecurityMetadataSourceTests { |
|
|
|
FilterInvocation fi = createFilterInvocation("/someAdminPage.html", null, null, |
|
|
|
FilterInvocation fi = createFilterInvocation("/someAdminPage.html", null, null, |
|
|
|
null); |
|
|
|
null); |
|
|
|
|
|
|
|
|
|
|
|
Collection<ConfigAttribute> response = fids.getAttributes(fi); |
|
|
|
Collection<ConfigAttribute> response = this.fids.getAttributes(fi); |
|
|
|
assertThat(response).isEqualTo(def); |
|
|
|
assertThat(response).isEqualTo(this.def); |
|
|
|
|
|
|
|
|
|
|
|
fi = createFilterInvocation("/someAdminPage.html", null, "?", null); |
|
|
|
fi = createFilterInvocation("/someAdminPage.html", null, "?", null); |
|
|
|
|
|
|
|
|
|
|
|
response = fids.getAttributes(fi); |
|
|
|
response = this.fids.getAttributes(fi); |
|
|
|
assertThat(response).isEqualTo(def); |
|
|
|
assertThat(response).isEqualTo(this.def); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private FilterInvocation createFilterInvocation(String servletPath, String pathInfo, |
|
|
|
private FilterInvocation createFilterInvocation(String servletPath, String pathInfo, |
|
|
|
|