Reformat code using spring-javaformat

Run `./gradlew format` to reformat all java files.

Issue gh-8945
This commit is contained in:
Phillip Webb
2020-08-10 16:39:17 -05:00
committed by Rob Winch
parent 81d9c6cac5
commit b7fc18262d
2487 changed files with 41506 additions and 46548 deletions

View File

@@ -72,4 +72,5 @@ public class TestSecurityContextHolderTests {
assertThat(TestSecurityContextHolder.getContext().getAuthentication()).isSameAs(authentication);
}
}

View File

@@ -39,16 +39,13 @@ public class SecurityTestExecutionListenerTests {
assertThat(SecurityContextHolder.getContext().getAuthentication().getName()).isEqualTo("user");
}
@WithMockUser
@Test
public void reactorContextTestSecurityContextHolderExecutionListenerTestIsRegistered() {
Mono<String> name = ReactiveSecurityContextHolder.getContext()
.map(SecurityContext::getAuthentication)
.map(Principal::getName);
Mono<String> name = ReactiveSecurityContextHolder.getContext().map(SecurityContext::getAuthentication)
.map(Principal::getName);
StepVerifier.create(name)
.expectNext("user")
.verifyComplete();
StepVerifier.create(name).expectNext("user").verifyComplete();
}
}

View File

@@ -25,8 +25,11 @@ import java.util.Collection;
* @author Rob Winch
*/
public class CustomUserDetails implements UserDetails {
private final String name;
private final String username;
private final Collection<? extends GrantedAuthority> authorities;
public CustomUserDetails(String name, String username) {
@@ -67,4 +70,5 @@ public class CustomUserDetails implements UserDetails {
public String toString() {
return "CustomUserDetails{" + "username='" + username + '\'' + '}';
}
}

View File

@@ -22,6 +22,7 @@ import org.springframework.security.test.context.support.WithSecurityContext;
*/
@WithSecurityContext(factory = WithMockCustomUserSecurityContextFactory.class)
public @interface WithMockCustomUser {
/**
* The username to be used. The default is rob
* @return
@@ -33,7 +34,6 @@ public @interface WithMockCustomUser {
* {@link org.springframework.security.core.GrantedAuthority} will be created for each
* value within roles. Each value in roles will automatically be prefixed with
* "ROLE_". For example, the default will result in "ROLE_USER" being used.
*
* @return
*/
String[] roles() default { "USER" };
@@ -43,4 +43,5 @@ public @interface WithMockCustomUser {
* @return
*/
String name() default "Rob Winch";
}

View File

@@ -24,16 +24,16 @@ import org.springframework.security.test.context.support.WithSecurityContextFact
/**
* @author Rob Winch
*/
public class WithMockCustomUserSecurityContextFactory implements
WithSecurityContextFactory<WithMockCustomUser> {
public class WithMockCustomUserSecurityContextFactory implements WithSecurityContextFactory<WithMockCustomUser> {
public SecurityContext createSecurityContext(WithMockCustomUser customUser) {
SecurityContext context = SecurityContextHolder.createEmptyContext();
CustomUserDetails principal = new CustomUserDetails(customUser.name(),
customUser.username());
Authentication auth = new UsernamePasswordAuthenticationToken(principal,
"password", principal.getAuthorities());
CustomUserDetails principal = new CustomUserDetails(customUser.name(), customUser.username());
Authentication auth = new UsernamePasswordAuthenticationToken(principal, "password",
principal.getAuthorities());
context.setAuthentication(auth);
return context;
}
}

View File

@@ -48,6 +48,7 @@ public class WithMockUserParentTests extends WithMockUserParent {
@EnableGlobalMethodSecurity(prePostEnabled = true)
@ComponentScan(basePackageClasses = HelloMessageService.class)
static class Config {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// @formatter:off
@@ -56,5 +57,7 @@ public class WithMockUserParentTests extends WithMockUserParent {
.withUser("user").password("password").roles("USER");
// @formatter:on
}
}
}

View File

@@ -37,6 +37,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = WithMockUserTests.Config.class)
public class WithMockUserTests {
@Autowired
private MessageService messageService;
@@ -63,8 +64,7 @@ public class WithMockUserTests {
@WithMockUser(username = "admin", roles = { "USER", "ADMIN" })
public void getMessageWithMockUserCustomUser() {
String message = messageService.getMessage();
assertThat(message).contains("admin").contains("ROLE_USER")
.contains("ROLE_ADMIN");
assertThat(message).contains("admin").contains("ROLE_USER").contains("ROLE_ADMIN");
}
@Test
@@ -77,6 +77,7 @@ public class WithMockUserTests {
@EnableGlobalMethodSecurity(prePostEnabled = true)
@ComponentScan(basePackageClasses = HelloMessageService.class)
static class Config {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// @formatter:off
@@ -85,5 +86,7 @@ public class WithMockUserTests {
.withUser("user").password("password").roles("USER");
// @formatter:on
}
}
}

View File

@@ -42,6 +42,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = WithUserDetailsTests.Config.class)
public class WithUserDetailsTests {
@Autowired
private MessageService messageService;
@@ -67,7 +68,7 @@ public class WithUserDetailsTests {
}
@Test
@WithUserDetails(value="customUsername", userDetailsServiceBeanName="myUserDetailsService")
@WithUserDetails(value = "customUsername", userDetailsServiceBeanName = "myUserDetailsService")
public void getMessageWithUserDetailsServiceBeanName() {
String message = messageService.getMessage();
assertThat(message).contains("customUsername");
@@ -77,6 +78,7 @@ public class WithUserDetailsTests {
@EnableGlobalMethodSecurity(prePostEnabled = true)
@ComponentScan(basePackageClasses = HelloMessageService.class)
static class Config {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// @formatter:off
@@ -89,6 +91,7 @@ public class WithUserDetailsTests {
public UserDetailsService myUserDetailsService() {
return new CustomUserDetailsService();
}
}
private Object getPrincipal() {
@@ -97,9 +100,10 @@ public class WithUserDetailsTests {
static class CustomUserDetailsService implements UserDetailsService {
public UserDetails loadUserByUsername(final String username)
throws UsernameNotFoundException {
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
return new CustomUserDetails("name", username);
}
}
}

View File

@@ -28,8 +28,8 @@ public class HelloMessageService implements MessageService {
@PreAuthorize("authenticated")
public String getMessage() {
Authentication authentication = SecurityContextHolder.getContext()
.getAuthentication();
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return "Hello " + authentication;
}
}

View File

@@ -19,5 +19,7 @@ package org.springframework.security.test.context.showcase.service;
* @author Rob Winch
*/
public interface MessageService {
String getMessage();
}

View File

@@ -49,8 +49,7 @@ public class ReactorContextTestExecutionListenerTests {
@Mock
private TestContext testContext;
private ReactorContextTestExecutionListener listener =
new ReactorContextTestExecutionListener();
private ReactorContextTestExecutionListener listener = new ReactorContextTestExecutionListener();
@After
public void cleanup() {
@@ -62,11 +61,9 @@ public class ReactorContextTestExecutionListenerTests {
public void beforeTestMethodWhenSecurityContextEmptyThenReactorContextNull() throws Exception {
this.listener.beforeTestMethod(this.testContext);
Mono<?> result = ReactiveSecurityContextHolder
.getContext();
Mono<?> result = ReactiveSecurityContextHolder.getContext();
StepVerifier.create(result)
.verifyComplete();
StepVerifier.create(result).verifyComplete();
}
@Test
@@ -75,16 +72,15 @@ public class ReactorContextTestExecutionListenerTests {
this.listener.beforeTestMethod(this.testContext);
Mono<?> result = ReactiveSecurityContextHolder
.getContext();
Mono<?> result = ReactiveSecurityContextHolder.getContext();
StepVerifier.create(result)
.verifyComplete();
StepVerifier.create(result).verifyComplete();
}
@Test
public void beforeTestMethodWhenAuthenticationThenReactorContextHasAuthentication() throws Exception {
TestingAuthenticationToken expectedAuthentication = new TestingAuthenticationToken("user", "password", "ROLE_USER");
TestingAuthenticationToken expectedAuthentication = new TestingAuthenticationToken("user", "password",
"ROLE_USER");
TestSecurityContextHolder.setAuthentication(expectedAuthentication);
this.listener.beforeTestMethod(this.testContext);
@@ -94,7 +90,8 @@ public class ReactorContextTestExecutionListenerTests {
@Test
public void beforeTestMethodWhenCustomContext() throws Exception {
TestingAuthenticationToken expectedAuthentication = new TestingAuthenticationToken("user", "password", "ROLE_USER");
TestingAuthenticationToken expectedAuthentication = new TestingAuthenticationToken("user", "password",
"ROLE_USER");
SecurityContext context = new CustomContext(expectedAuthentication);
TestSecurityContextHolder.setContext(context);
@@ -104,6 +101,7 @@ public class ReactorContextTestExecutionListenerTests {
}
static class CustomContext implements SecurityContext {
private Authentication authentication;
CustomContext(Authentication authentication) {
@@ -119,43 +117,42 @@ public class ReactorContextTestExecutionListenerTests {
public void setAuthentication(Authentication authentication) {
this.authentication = authentication;
}
}
@Test
public void beforeTestMethodWhenExistingAuthenticationThenReactorContextHasOriginalAuthentication() throws Exception {
TestingAuthenticationToken expectedAuthentication = new TestingAuthenticationToken("user", "password", "ROLE_USER");
TestingAuthenticationToken contextHolder = new TestingAuthenticationToken("contextHolder", "password", "ROLE_USER");
public void beforeTestMethodWhenExistingAuthenticationThenReactorContextHasOriginalAuthentication()
throws Exception {
TestingAuthenticationToken expectedAuthentication = new TestingAuthenticationToken("user", "password",
"ROLE_USER");
TestingAuthenticationToken contextHolder = new TestingAuthenticationToken("contextHolder", "password",
"ROLE_USER");
TestSecurityContextHolder.setAuthentication(contextHolder);
this.listener.beforeTestMethod(this.testContext);
Mono<Authentication> authentication = Mono.just("any")
.flatMap(s -> ReactiveSecurityContextHolder.getContext()
.map(SecurityContext::getAuthentication)
)
.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(expectedAuthentication));
.flatMap(s -> ReactiveSecurityContextHolder.getContext().map(SecurityContext::getAuthentication))
.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(expectedAuthentication));
StepVerifier.create(authentication)
.expectNext(expectedAuthentication)
.verifyComplete();
StepVerifier.create(authentication).expectNext(expectedAuthentication).verifyComplete();
}
@Test
public void beforeTestMethodWhenClearThenReactorContextDoesNotOverride() throws Exception {
TestingAuthenticationToken expectedAuthentication = new TestingAuthenticationToken("user", "password", "ROLE_USER");
TestingAuthenticationToken contextHolder = new TestingAuthenticationToken("contextHolder", "password", "ROLE_USER");
TestingAuthenticationToken expectedAuthentication = new TestingAuthenticationToken("user", "password",
"ROLE_USER");
TestingAuthenticationToken contextHolder = new TestingAuthenticationToken("contextHolder", "password",
"ROLE_USER");
TestSecurityContextHolder.setAuthentication(contextHolder);
this.listener.beforeTestMethod(this.testContext);
Mono<Authentication> authentication = Mono.just("any")
.flatMap(s -> ReactiveSecurityContextHolder.getContext()
.map(SecurityContext::getAuthentication)
)
.subscriberContext(ReactiveSecurityContextHolder.clearContext());
.flatMap(s -> ReactiveSecurityContextHolder.getContext().map(SecurityContext::getAuthentication))
.subscriberContext(ReactiveSecurityContextHolder.clearContext());
StepVerifier.create(authentication)
.verifyComplete();
StepVerifier.create(authentication).verifyComplete();
}
@Test
@@ -194,32 +191,28 @@ public class ReactorContextTestExecutionListenerTests {
}
@Test
public void checkSecurityContextResolutionWhenSubscribedContextCalledOnTheDifferentThreadThanWithSecurityContextTestExecutionListener() throws Exception {
TestingAuthenticationToken contextHolder = new TestingAuthenticationToken("contextHolder", "password", "ROLE_USER");
public void checkSecurityContextResolutionWhenSubscribedContextCalledOnTheDifferentThreadThanWithSecurityContextTestExecutionListener()
throws Exception {
TestingAuthenticationToken contextHolder = new TestingAuthenticationToken("contextHolder", "password",
"ROLE_USER");
TestSecurityContextHolder.setAuthentication(contextHolder);
this.listener.beforeTestMethod(this.testContext);
ForkJoinPool.commonPool()
.submit(() -> assertAuthentication(contextHolder))
.join();
ForkJoinPool.commonPool().submit(() -> assertAuthentication(contextHolder)).join();
}
public void assertAuthentication(Authentication expected) {
Mono<Authentication> authentication = ReactiveSecurityContextHolder.getContext()
.map(SecurityContext::getAuthentication);
.map(SecurityContext::getAuthentication);
StepVerifier.create(authentication)
.expectNext(expected)
.verifyComplete();
StepVerifier.create(authentication).expectNext(expected).verifyComplete();
}
private void assertSecurityContext(SecurityContext expected) {
Mono<SecurityContext> securityContext = ReactiveSecurityContextHolder.getContext();
StepVerifier.create(securityContext)
.expectNext(expected)
.verifyComplete();
StepVerifier.create(securityContext).expectNext(expected).verifyComplete();
}
}

View File

@@ -26,22 +26,23 @@ import static org.assertj.core.api.Assertions.assertThat;
* @since 5.0
*/
public class WithAnonymousUserTests {
@Test
public void defaults() {
WithSecurityContext context = AnnotatedElementUtils.findMergedAnnotation(Annotated.class,
WithSecurityContext.class);
WithSecurityContext.class);
assertThat(context.setupBefore()).isEqualTo(TestExecutionEvent.TEST_METHOD);
}
@WithAnonymousUser
private class Annotated {
}
@Test
public void findMergedAnnotationWhenSetupExplicitThenOverridden() {
WithSecurityContext context = AnnotatedElementUtils
.findMergedAnnotation(SetupExplicit.class,
WithSecurityContext context = AnnotatedElementUtils.findMergedAnnotation(SetupExplicit.class,
WithSecurityContext.class);
assertThat(context.setupBefore()).isEqualTo(TestExecutionEvent.TEST_METHOD);
@@ -49,17 +50,20 @@ public class WithAnonymousUserTests {
@WithAnonymousUser(setupBefore = TestExecutionEvent.TEST_METHOD)
private class SetupExplicit {
}
@Test
public void findMergedAnnotationWhenSetupOverriddenThenOverridden() {
WithSecurityContext context = AnnotatedElementUtils.findMergedAnnotation(SetupOverridden.class,
WithSecurityContext.class);
WithSecurityContext.class);
assertThat(context.setupBefore()).isEqualTo(TestExecutionEvent.TEST_EXECUTION);
}
@WithAnonymousUser(setupBefore = TestExecutionEvent.TEST_EXECUTION)
private class SetupOverridden {
}
}

View File

@@ -49,8 +49,7 @@ public class WithMockUserSecurityContextFactoryTests {
when(withUser.roles()).thenReturn(new String[] { "USER" });
when(withUser.authorities()).thenReturn(new String[] {});
assertThat(factory.createSecurityContext(withUser).getAuthentication().getName())
.isEqualTo(withUser.value());
assertThat(factory.createSecurityContext(withUser).getAuthentication().getName()).isEqualTo(withUser.value());
}
@Test
@@ -71,10 +70,8 @@ public class WithMockUserSecurityContextFactoryTests {
when(withUser.roles()).thenReturn(new String[] { "USER", "CUSTOM" });
when(withUser.authorities()).thenReturn(new String[] {});
assertThat(
factory.createSecurityContext(withUser).getAuthentication()
.getAuthorities()).extracting("authority").containsOnly(
"ROLE_USER", "ROLE_CUSTOM");
assertThat(factory.createSecurityContext(withUser).getAuthentication().getAuthorities()).extracting("authority")
.containsOnly("ROLE_USER", "ROLE_CUSTOM");
}
@Test
@@ -84,10 +81,8 @@ public class WithMockUserSecurityContextFactoryTests {
when(withUser.roles()).thenReturn(new String[] { "USER" });
when(withUser.authorities()).thenReturn(new String[] { "USER", "CUSTOM" });
assertThat(
factory.createSecurityContext(withUser).getAuthentication()
.getAuthorities()).extracting("authority").containsOnly(
"USER", "CUSTOM");
assertThat(factory.createSecurityContext(withUser).getAuthentication().getAuthorities()).extracting("authority")
.containsOnly("USER", "CUSTOM");
}
@Test(expected = IllegalStateException.class)
@@ -107,4 +102,5 @@ public class WithMockUserSecurityContextFactoryTests {
factory.createSecurityContext(withUser);
}
}

View File

@@ -25,8 +25,7 @@ public class WithMockUserTests {
@Test
public void defaults() {
WithMockUser mockUser = AnnotatedElementUtils.findMergedAnnotation(Annotated.class,
WithMockUser.class);
WithMockUser mockUser = AnnotatedElementUtils.findMergedAnnotation(Annotated.class, WithMockUser.class);
assertThat(mockUser.value()).isEqualTo("user");
assertThat(mockUser.username()).isEmpty();
assertThat(mockUser.password()).isEqualTo("password");
@@ -34,19 +33,19 @@ public class WithMockUserTests {
assertThat(mockUser.setupBefore()).isEqualByComparingTo(TestExecutionEvent.TEST_METHOD);
WithSecurityContext context = AnnotatedElementUtils.findMergedAnnotation(Annotated.class,
WithSecurityContext.class);
WithSecurityContext.class);
assertThat(context.setupBefore()).isEqualTo(TestExecutionEvent.TEST_METHOD);
}
@WithMockUser
private class Annotated {
}
@Test
public void findMergedAnnotationWhenSetupExplicitThenOverridden() {
WithSecurityContext context = AnnotatedElementUtils
.findMergedAnnotation(SetupExplicit.class,
WithSecurityContext context = AnnotatedElementUtils.findMergedAnnotation(SetupExplicit.class,
WithSecurityContext.class);
assertThat(context.setupBefore()).isEqualTo(TestExecutionEvent.TEST_METHOD);
@@ -54,17 +53,20 @@ public class WithMockUserTests {
@WithMockUser(setupBefore = TestExecutionEvent.TEST_METHOD)
private class SetupExplicit {
}
@Test
public void findMergedAnnotationWhenSetupOverriddenThenOverridden() {
WithSecurityContext context = AnnotatedElementUtils.findMergedAnnotation(SetupOverridden.class,
WithSecurityContext.class);
WithSecurityContext.class);
assertThat(context.setupBefore()).isEqualTo(TestExecutionEvent.TEST_EXECUTION);
}
@WithMockUser(setupBefore = TestExecutionEvent.TEST_EXECUTION)
private class SetupOverridden {
}
}

View File

@@ -50,6 +50,7 @@ import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class WithSecurityContextTestExcecutionListenerTests {
private ConfigurableApplicationContext context;
@Mock
@@ -76,8 +77,7 @@ public class WithSecurityContextTestExcecutionListenerTests {
public void beforeTestMethodNullSecurityContextNoError() throws Exception {
Class testClass = FakeTest.class;
when(testContext.getTestClass()).thenReturn(testClass);
when(testContext.getTestMethod()).thenReturn(
ReflectionUtils.findMethod(testClass, "testNoAnnotation"));
when(testContext.getTestMethod()).thenReturn(ReflectionUtils.findMethod(testClass, "testNoAnnotation"));
listener.beforeTestMethod(testContext);
}
@@ -87,14 +87,13 @@ public class WithSecurityContextTestExcecutionListenerTests {
public void beforeTestMethodNoApplicationContext() throws Exception {
Class testClass = FakeTest.class;
when(testContext.getApplicationContext()).thenThrow(new IllegalStateException());
when(testContext.getTestMethod()).thenReturn(
ReflectionUtils.findMethod(testClass, "testWithMockUser"));
when(testContext.getTestMethod()).thenReturn(ReflectionUtils.findMethod(testClass, "testWithMockUser"));
listener.beforeTestMethod(testContext);
assertThat(TestSecurityContextHolder.getContext().getAuthentication().getName())
.isEqualTo("user");
assertThat(TestSecurityContextHolder.getContext().getAuthentication().getName()).isEqualTo("user");
}
// gh-3962
@Test
public void withSecurityContextAfterSqlScripts() {
@@ -126,13 +125,11 @@ public class WithSecurityContextTestExcecutionListenerTests {
@Test
// gh-3837
public void handlesGenericAnnotation() throws Exception {
Method method = ReflectionUtils.findMethod(
WithSecurityContextTestExcecutionListenerTests.class,
Method method = ReflectionUtils.findMethod(WithSecurityContextTestExcecutionListenerTests.class,
"handlesGenericAnnotationTestMethod");
TestContext testContext = mock(TestContext.class);
when(testContext.getTestMethod()).thenReturn(method);
when(testContext.getApplicationContext())
.thenThrow(new IllegalStateException(""));
when(testContext.getApplicationContext()).thenThrow(new IllegalStateException(""));
this.listener.beforeTestMethod(testContext);
@@ -147,11 +144,12 @@ public class WithSecurityContextTestExcecutionListenerTests {
@Retention(RetentionPolicy.RUNTIME)
@WithSecurityContext(factory = SuperClassWithSecurityContextFactory.class)
@interface WithSuperClassWithSecurityContext {
String username() default "WithSuperClassWithSecurityContext";
}
static class SuperClassWithSecurityContextFactory
implements WithSecurityContextFactory<Annotation> {
static class SuperClassWithSecurityContextFactory implements WithSecurityContextFactory<Annotation> {
@Override
public SecurityContext createSecurityContext(Annotation annotation) {
@@ -159,9 +157,11 @@ public class WithSecurityContextTestExcecutionListenerTests {
context.setAuthentication(new TestingAuthenticationToken(annotation, "NA"));
return context;
}
}
static class FakeTest {
public void testNoAnnotation() {
}
@@ -169,9 +169,12 @@ public class WithSecurityContextTestExcecutionListenerTests {
public void testWithMockUser() {
}
}
@Configuration
static class Config {
}
}

View File

@@ -54,8 +54,10 @@ import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(classes = WithSecurityContextTestExecutionListenerTests.NoOpConfiguration.class)
public class WithSecurityContextTestExecutionListenerTests {
@ClassRule
public static final SpringClassRule spring = new SpringClassRule();
@Rule
public final SpringMethodRule springMethod = new SpringMethodRule();
@@ -81,7 +83,8 @@ public class WithSecurityContextTestExecutionListenerTests {
this.listener.beforeTestMethod(this.testContext);
assertThat(TestSecurityContextHolder.getContext().getAuthentication()).isNotNull();
verify(this.testContext, never()).setAttribute(eq(WithSecurityContextTestExecutionListener.SECURITY_CONTEXT_ATTR_NAME), any(SecurityContext.class));
verify(this.testContext, never()).setAttribute(
eq(WithSecurityContextTestExecutionListener.SECURITY_CONTEXT_ATTR_NAME), any(SecurityContext.class));
}
@Test
@@ -93,7 +96,8 @@ public class WithSecurityContextTestExecutionListenerTests {
this.listener.beforeTestMethod(this.testContext);
assertThat(TestSecurityContextHolder.getContext().getAuthentication()).isNotNull();
verify(this.testContext, never()).setAttribute(eq(WithSecurityContextTestExecutionListener.SECURITY_CONTEXT_ATTR_NAME), any(SecurityContext.class));
verify(this.testContext, never()).setAttribute(
eq(WithSecurityContextTestExecutionListener.SECURITY_CONTEXT_ATTR_NAME), any(SecurityContext.class));
}
@Test
@@ -105,8 +109,8 @@ public class WithSecurityContextTestExecutionListenerTests {
this.listener.beforeTestMethod(this.testContext);
assertThat(TestSecurityContextHolder.getContext().getAuthentication()).isNull();
verify(this.testContext).setAttribute(eq(WithSecurityContextTestExecutionListener.SECURITY_CONTEXT_ATTR_NAME)
, ArgumentMatchers.<Supplier<SecurityContext>>any());
verify(this.testContext).setAttribute(eq(WithSecurityContextTestExecutionListener.SECURITY_CONTEXT_ATTR_NAME),
ArgumentMatchers.<Supplier<SecurityContext>>any());
}
@Test
@@ -148,17 +152,22 @@ public class WithSecurityContextTestExecutionListenerTests {
SecurityContextImpl securityContext = new SecurityContextImpl();
securityContext.setAuthentication(new TestingAuthenticationToken("user", "passsword", "ROLE_USER"));
Supplier<SecurityContext> supplier = () -> securityContext;
when(this.testContext.removeAttribute(WithSecurityContextTestExecutionListener.SECURITY_CONTEXT_ATTR_NAME)).thenReturn(supplier);
when(this.testContext.removeAttribute(WithSecurityContextTestExecutionListener.SECURITY_CONTEXT_ATTR_NAME))
.thenReturn(supplier);
this.listener.beforeTestExecution(this.testContext);
assertThat(TestSecurityContextHolder.getContext().getAuthentication()).isEqualTo(securityContext.getAuthentication());
assertThat(TestSecurityContextHolder.getContext().getAuthentication())
.isEqualTo(securityContext.getAuthentication());
}
@Configuration
static class NoOpConfiguration {}
static class NoOpConfiguration {
}
static class TheTest {
@WithMockUser(setupBefore = TestExecutionEvent.TEST_EXECUTION)
public void withMockUserTestExecution() {
}
@@ -174,6 +183,7 @@ public class WithSecurityContextTestExecutionListenerTests {
@WithUserDetails(setupBefore = TestExecutionEvent.TEST_EXECUTION)
public void withUserDetails() {
}
}
}

View File

@@ -40,10 +40,13 @@ public class WithUserDetailsSecurityContextFactoryTests {
@Mock
private ReactiveUserDetailsService reactiveUserDetailsService;
@Mock
private UserDetailsService userDetailsService;
@Mock
private UserDetails userDetails;
@Mock
private BeanFactory beans;
@@ -78,8 +81,7 @@ public class WithUserDetailsSecurityContextFactoryTests {
when(userDetailsService.loadUserByUsername(username)).thenReturn(userDetails);
SecurityContext context = factory.createSecurityContext(withUserDetails);
assertThat(context.getAuthentication()).isInstanceOf(
UsernamePasswordAuthenticationToken.class);
assertThat(context.getAuthentication()).isInstanceOf(UsernamePasswordAuthenticationToken.class);
assertThat(context.getAuthentication().getPrincipal()).isEqualTo(userDetails);
verify(beans).getBean(UserDetailsService.class);
}
@@ -89,15 +91,15 @@ public class WithUserDetailsSecurityContextFactoryTests {
public void createSecurityContextWithUserDetailsServiceName() {
String beanName = "secondUserDetailsServiceBean";
String username = "user";
when(this.beans.getBean(beanName, ReactiveUserDetailsService.class)).thenThrow(new BeanNotOfRequiredTypeException("", ReactiveUserDetailsService.class, UserDetailsService.class));
when(this.beans.getBean(beanName, ReactiveUserDetailsService.class)).thenThrow(
new BeanNotOfRequiredTypeException("", ReactiveUserDetailsService.class, UserDetailsService.class));
when(withUserDetails.value()).thenReturn(username);
when(withUserDetails.userDetailsServiceBeanName()).thenReturn(beanName);
when(userDetailsService.loadUserByUsername(username)).thenReturn(userDetails);
when(beans.getBean(beanName, UserDetailsService.class)).thenReturn(userDetailsService);
SecurityContext context = factory.createSecurityContext(withUserDetails);
assertThat(context.getAuthentication()).isInstanceOf(
UsernamePasswordAuthenticationToken.class);
assertThat(context.getAuthentication()).isInstanceOf(UsernamePasswordAuthenticationToken.class);
assertThat(context.getAuthentication().getPrincipal()).isEqualTo(userDetails);
verify(beans).getBean(beanName, UserDetailsService.class);
}
@@ -110,8 +112,7 @@ public class WithUserDetailsSecurityContextFactoryTests {
when(this.reactiveUserDetailsService.findByUsername(username)).thenReturn(Mono.just(userDetails));
SecurityContext context = factory.createSecurityContext(withUserDetails);
assertThat(context.getAuthentication()).isInstanceOf(
UsernamePasswordAuthenticationToken.class);
assertThat(context.getAuthentication()).isInstanceOf(UsernamePasswordAuthenticationToken.class);
assertThat(context.getAuthentication().getPrincipal()).isEqualTo(userDetails);
verify(this.beans).getBean(ReactiveUserDetailsService.class);
}
@@ -122,13 +123,14 @@ public class WithUserDetailsSecurityContextFactoryTests {
String username = "user";
when(withUserDetails.value()).thenReturn(username);
when(withUserDetails.userDetailsServiceBeanName()).thenReturn(beanName);
when(this.beans.getBean(beanName, ReactiveUserDetailsService.class)).thenReturn(this.reactiveUserDetailsService);
when(this.beans.getBean(beanName, ReactiveUserDetailsService.class))
.thenReturn(this.reactiveUserDetailsService);
when(this.reactiveUserDetailsService.findByUsername(username)).thenReturn(Mono.just(userDetails));
SecurityContext context = factory.createSecurityContext(withUserDetails);
assertThat(context.getAuthentication()).isInstanceOf(
UsernamePasswordAuthenticationToken.class);
assertThat(context.getAuthentication()).isInstanceOf(UsernamePasswordAuthenticationToken.class);
assertThat(context.getAuthentication().getPrincipal()).isEqualTo(userDetails);
verify(this.beans).getBean(beanName, ReactiveUserDetailsService.class);
}
}

View File

@@ -25,12 +25,10 @@ public class WithUserDetailsTests {
@Test
public void defaults() {
WithUserDetails userDetails = AnnotationUtils.findAnnotation(Annotated.class,
WithUserDetails.class);
WithUserDetails userDetails = AnnotationUtils.findAnnotation(Annotated.class, WithUserDetails.class);
assertThat(userDetails.value()).isEqualTo("user");
WithSecurityContext context = AnnotatedElementUtils
.findMergedAnnotation(Annotated.class,
WithSecurityContext context = AnnotatedElementUtils.findMergedAnnotation(Annotated.class,
WithSecurityContext.class);
assertThat(context.setupBefore()).isEqualTo(TestExecutionEvent.TEST_METHOD);
@@ -38,12 +36,12 @@ public class WithUserDetailsTests {
@WithUserDetails
private static class Annotated {
}
@Test
public void findMergedAnnotationWhenSetupExplicitThenOverridden() {
WithSecurityContext context = AnnotatedElementUtils
.findMergedAnnotation(SetupExplicit.class,
WithSecurityContext context = AnnotatedElementUtils.findMergedAnnotation(SetupExplicit.class,
WithSecurityContext.class);
assertThat(context.setupBefore()).isEqualTo(TestExecutionEvent.TEST_METHOD);
@@ -51,12 +49,12 @@ public class WithUserDetailsTests {
@WithUserDetails(setupBefore = TestExecutionEvent.TEST_METHOD)
private class SetupExplicit {
}
@Test
public void findMergedAnnotationWhenSetupOverriddenThenOverridden() {
WithSecurityContext context = AnnotatedElementUtils
.findMergedAnnotation(SetupOverridden.class,
WithSecurityContext context = AnnotatedElementUtils.findMergedAnnotation(SetupOverridden.class,
WithSecurityContext.class);
assertThat(context.setupBefore()).isEqualTo(TestExecutionEvent.TEST_EXECUTION);
@@ -64,5 +62,7 @@ public class WithUserDetailsTests {
@WithUserDetails(setupBefore = TestExecutionEvent.TEST_EXECUTION)
private class SetupOverridden {
}
}

View File

@@ -34,13 +34,12 @@ import static org.assertj.core.api.Assertions.assertThat;
* @since 5.0
*/
abstract class AbstractMockServerConfigurersTests {
protected PrincipalController controller = new PrincipalController();
protected SecurityContextController securityContextController = new SecurityContextController();
protected User.UserBuilder userBuilder = User
.withUsername("user")
.password("password")
.roles("USER");
protected User.UserBuilder userBuilder = User.withUsername("user").password("password").roles("USER");
protected void assertPrincipalCreatedFromUserDetails(Principal principal, UserDetails originalUserDetails) {
assertThat(principal).isInstanceOf(UsernamePasswordAuthenticationToken.class);
@@ -56,6 +55,7 @@ abstract class AbstractMockServerConfigurersTests {
@RestController
protected static class PrincipalController {
volatile Principal principal;
@RequestMapping("/**")
@@ -74,10 +74,12 @@ abstract class AbstractMockServerConfigurersTests {
assertThat(this.principal).isEqualTo(expected);
this.principal = null;
}
}
@RestController
protected static class SecurityContextController {
volatile SecurityContext securityContext;
@RequestMapping("/**")
@@ -91,5 +93,7 @@ abstract class AbstractMockServerConfigurersTests {
this.securityContext = null;
return result;
}
}
}

View File

@@ -45,31 +45,24 @@ import static org.springframework.security.test.web.reactive.server.SecurityMock
*/
@RunWith(MockitoJUnitRunner.class)
public class SecurityMockServerConfigurerOpaqueTokenTests extends AbstractMockServerConfigurersTests {
private GrantedAuthority authority1 = new SimpleGrantedAuthority("one");
private GrantedAuthority authority2 = new SimpleGrantedAuthority("two");
private WebTestClient client = WebTestClient
.bindToController(securityContextController)
private WebTestClient client = WebTestClient.bindToController(securityContextController)
.webFilter(new SecurityContextServerWebExchangeWebFilter())
.argumentResolvers(resolvers -> resolvers.addCustomResolver(
new CurrentSecurityContextArgumentResolver(new ReactiveAdapterRegistry())))
.apply(springSecurity())
.configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.build();
.argumentResolvers(resolvers -> resolvers
.addCustomResolver(new CurrentSecurityContextArgumentResolver(new ReactiveAdapterRegistry())))
.apply(springSecurity()).configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).build();
@Test
public void mockOpaqueTokenWhenUsingDefaultsThenBearerTokenAuthentication() {
this.client
.mutateWith(mockOpaqueToken())
.get()
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOpaqueToken()).get().exchange().expectStatus().isOk();
SecurityContext context = securityContextController.removeSecurityContext();
assertThat(context.getAuthentication()).isInstanceOf(
BearerTokenAuthentication.class);
assertThat(context.getAuthentication()).isInstanceOf(BearerTokenAuthentication.class);
BearerTokenAuthentication token = (BearerTokenAuthentication) context.getAuthentication();
assertThat(token.getAuthorities()).isNotEmpty();
assertThat(token.getToken()).isNotNull();
@@ -78,27 +71,19 @@ public class SecurityMockServerConfigurerOpaqueTokenTests extends AbstractMockSe
@Test
public void mockOpaqueTokenWhenAuthoritiesThenBearerTokenAuthentication() {
this.client
.mutateWith(mockOpaqueToken()
.authorities(this.authority1, this.authority2))
.get()
.exchange()
this.client.mutateWith(mockOpaqueToken().authorities(this.authority1, this.authority2)).get().exchange()
.expectStatus().isOk();
SecurityContext context = securityContextController.removeSecurityContext();
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities())
.containsOnly(this.authority1, this.authority2);
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities()).containsOnly(this.authority1,
this.authority2);
}
@Test
public void mockOpaqueTokenWhenAttributesThenBearerTokenAuthentication() {
String sub = new String("my-subject");
this.client
.mutateWith(mockOpaqueToken()
.attributes(attributes -> attributes.put(SUBJECT, sub)))
.get()
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOpaqueToken().attributes(attributes -> attributes.put(SUBJECT, sub))).get()
.exchange().expectStatus().isOk();
SecurityContext context = securityContextController.removeSecurityContext();
assertThat(context.getAuthentication()).isInstanceOf(BearerTokenAuthentication.class);
@@ -109,12 +94,7 @@ public class SecurityMockServerConfigurerOpaqueTokenTests extends AbstractMockSe
@Test
public void mockOpaqueTokenWhenPrincipalThenBearerTokenAuthentication() {
OAuth2AuthenticatedPrincipal principal = active();
this.client
.mutateWith(mockOpaqueToken()
.principal(principal))
.get()
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOpaqueToken().principal(principal)).get().exchange().expectStatus().isOk();
SecurityContext context = securityContextController.removeSecurityContext();
assertThat(context.getAuthentication()).isInstanceOf(BearerTokenAuthentication.class);
@@ -126,13 +106,8 @@ public class SecurityMockServerConfigurerOpaqueTokenTests extends AbstractMockSe
public void mockOpaqueTokenWhenPrincipalSpecifiedThenLastCalledTakesPrecedence() {
OAuth2AuthenticatedPrincipal principal = active(a -> a.put("scope", "user"));
this.client
.mutateWith(mockOpaqueToken()
.attributes(a -> a.put(SUBJECT, "foo"))
.principal(principal))
.get()
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOpaqueToken().attributes(a -> a.put(SUBJECT, "foo")).principal(principal)).get()
.exchange().expectStatus().isOk();
SecurityContext context = securityContextController.removeSecurityContext();
assertThat(context.getAuthentication()).isInstanceOf(BearerTokenAuthentication.class);
@@ -140,13 +115,8 @@ public class SecurityMockServerConfigurerOpaqueTokenTests extends AbstractMockSe
assertThat((String) ((OAuth2AuthenticatedPrincipal) token.getPrincipal()).getAttribute(SUBJECT))
.isEqualTo(principal.getAttribute(SUBJECT));
this.client
.mutateWith(mockOpaqueToken()
.principal(principal)
.attributes(a -> a.put(SUBJECT, "bar")))
.get()
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOpaqueToken().principal(principal).attributes(a -> a.put(SUBJECT, "bar"))).get()
.exchange().expectStatus().isOk();
context = securityContextController.removeSecurityContext();
assertThat(context.getAuthentication()).isInstanceOf(BearerTokenAuthentication.class);
@@ -154,4 +124,5 @@ public class SecurityMockServerConfigurerOpaqueTokenTests extends AbstractMockSe
assertThat((String) ((OAuth2AuthenticatedPrincipal) token.getPrincipal()).getAttribute(SUBJECT))
.isEqualTo("bar");
}
}

View File

@@ -42,21 +42,14 @@ import static org.springframework.security.test.web.reactive.server.SecurityMock
@SecurityTestExecutionListeners
public class SecurityMockServerConfigurersAnnotatedTests extends AbstractMockServerConfigurersTests {
WebTestClient client = WebTestClient
.bindToController(controller)
.webFilter(new SecurityContextServerWebExchangeWebFilter())
.apply(springSecurity())
.configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.build();
WebTestClient client = WebTestClient.bindToController(controller)
.webFilter(new SecurityContextServerWebExchangeWebFilter()).apply(springSecurity()).configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).build();
@Test
@WithMockUser
public void withMockUserWhenOnMethodThenSuccess() {
client
.get()
.exchange()
.expectStatus().isOk();
client.get().exchange().expectStatus().isOk();
Authentication authentication = TestSecurityContextHolder.getContext().getAuthentication();
controller.assertPrincipalIsEqualTo(authentication);
@@ -65,20 +58,13 @@ public class SecurityMockServerConfigurersAnnotatedTests extends AbstractMockSer
@Test
@WithMockUser
public void withMockUserWhenGlobalMockPrincipalThenOverridesAnnotation() {
TestingAuthenticationToken authentication = new TestingAuthenticationToken("authentication", "secret", "ROLE_USER");
client = WebTestClient
.bindToController(controller)
.webFilter(new SecurityContextServerWebExchangeWebFilter())
.apply(springSecurity())
.apply(mockAuthentication(authentication))
.configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.build();
TestingAuthenticationToken authentication = new TestingAuthenticationToken("authentication", "secret",
"ROLE_USER");
client = WebTestClient.bindToController(controller).webFilter(new SecurityContextServerWebExchangeWebFilter())
.apply(springSecurity()).apply(mockAuthentication(authentication)).configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).build();
client
.get()
.exchange()
.expectStatus().isOk();
client.get().exchange().expectStatus().isOk();
controller.assertPrincipalIsEqualTo(authentication);
}
@@ -86,12 +72,9 @@ public class SecurityMockServerConfigurersAnnotatedTests extends AbstractMockSer
@Test
@WithMockUser
public void withMockUserWhenMutateWithMockPrincipalThenOverridesAnnotation() {
TestingAuthenticationToken authentication = new TestingAuthenticationToken("authentication", "secret", "ROLE_USER");
client
.mutateWith(mockAuthentication(authentication))
.get()
.exchange()
.expectStatus().isOk();
TestingAuthenticationToken authentication = new TestingAuthenticationToken("authentication", "secret",
"ROLE_USER");
client.mutateWith(mockAuthentication(authentication)).get().exchange().expectStatus().isOk();
controller.assertPrincipalIsEqualTo(authentication);
}
@@ -99,20 +82,13 @@ public class SecurityMockServerConfigurersAnnotatedTests extends AbstractMockSer
@Test
@WithMockUser
public void withMockUserWhenMutateWithMockPrincipalAndNoMutateThenOverridesAnnotationAndUsesAnnotation() {
TestingAuthenticationToken authentication = new TestingAuthenticationToken("authentication", "secret", "ROLE_USER");
client
.mutateWith(mockAuthentication(authentication))
.get()
.exchange()
.expectStatus().isOk();
TestingAuthenticationToken authentication = new TestingAuthenticationToken("authentication", "secret",
"ROLE_USER");
client.mutateWith(mockAuthentication(authentication)).get().exchange().expectStatus().isOk();
controller.assertPrincipalIsEqualTo(authentication);
client
.get()
.exchange()
.expectStatus().isOk();
client.get().exchange().expectStatus().isOk();
assertPrincipalCreatedFromUserDetails(controller.removePrincipal(), userBuilder.build());
}
@@ -121,16 +97,7 @@ public class SecurityMockServerConfigurersAnnotatedTests extends AbstractMockSer
@WithMockUser
public void withMockUserWhenOnMethodAndRequestIsExecutedOnDifferentThreadThenSuccess() {
Authentication authentication = TestSecurityContextHolder.getContext().getAuthentication();
ForkJoinPool
.commonPool()
.submit(() ->
client
.get()
.exchange()
.expectStatus()
.isOk()
)
.join();
ForkJoinPool.commonPool().submit(() -> client.get().exchange().expectStatus().isOk()).join();
controller.assertPrincipalIsEqualTo(authentication);
}
@@ -138,32 +105,18 @@ public class SecurityMockServerConfigurersAnnotatedTests extends AbstractMockSer
@Test
@WithMockUser
public void withMockUserAndWithCallOnSeparateThreadWhenMutateWithMockPrincipalAndNoMutateThenOverridesAnnotationAndUsesAnnotation() {
TestingAuthenticationToken authentication = new TestingAuthenticationToken("authentication", "secret", "ROLE_USER");
TestingAuthenticationToken authentication = new TestingAuthenticationToken("authentication", "secret",
"ROLE_USER");
ForkJoinPool
.commonPool()
.submit(() ->
client
.mutateWith(mockAuthentication(authentication))
.get()
.exchange()
.expectStatus().isOk()
)
.join();
ForkJoinPool.commonPool().submit(
() -> client.mutateWith(mockAuthentication(authentication)).get().exchange().expectStatus().isOk())
.join();
controller.assertPrincipalIsEqualTo(authentication);
ForkJoinPool
.commonPool()
.submit(() ->
client
.get()
.exchange()
.expectStatus().isOk()
)
.join();
ForkJoinPool.commonPool().submit(() -> client.get().exchange().expectStatus().isOk()).join();
assertPrincipalCreatedFromUserDetails(controller.removePrincipal(), userBuilder.build());
}
}

View File

@@ -42,21 +42,15 @@ import static org.springframework.security.test.web.reactive.server.SecurityMock
@RunWith(SpringRunner.class)
@SecurityTestExecutionListeners
public class SecurityMockServerConfigurersClassAnnotatedTests extends AbstractMockServerConfigurersTests {
WebTestClient client = WebTestClient
.bindToController(controller)
.webFilter(new SecurityContextServerWebExchangeWebFilter())
.apply(springSecurity())
.configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.build();
WebTestClient client = WebTestClient.bindToController(controller)
.webFilter(new SecurityContextServerWebExchangeWebFilter()).apply(springSecurity()).configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).build();
@Test
public void wheMockUserWhenClassAnnotatedThenSuccess() {
client
.get()
.exchange()
.expectStatus().isOk()
.expectBody(String.class).consumeWith( response -> assertThat(response.getResponseBody()).contains("\"username\":\"user\""));
client.get().exchange().expectStatus().isOk().expectBody(String.class)
.consumeWith(response -> assertThat(response.getResponseBody()).contains("\"username\":\"user\""));
Authentication authentication = TestSecurityContextHolder.getContext().getAuthentication();
controller.assertPrincipalIsEqualTo(authentication);
@@ -65,11 +59,8 @@ public class SecurityMockServerConfigurersClassAnnotatedTests extends AbstractMo
@Test
@WithMockUser("method-user")
public void withMockUserWhenClassAndMethodAnnotationThenMethodOverrides() {
client
.get()
.exchange()
.expectStatus().isOk()
.expectBody(String.class).consumeWith( response -> assertThat(response.getResponseBody()).contains("\"username\":\"method-user\""));
client.get().exchange().expectStatus().isOk().expectBody(String.class).consumeWith(
response -> assertThat(response.getResponseBody()).contains("\"username\":\"method-user\""));
Authentication authentication = TestSecurityContextHolder.getContext().getAuthentication();
controller.assertPrincipalIsEqualTo(authentication);
@@ -77,14 +68,12 @@ public class SecurityMockServerConfigurersClassAnnotatedTests extends AbstractMo
@Test
public void withMockUserWhenMutateWithThenMustateWithOverrides() {
client
.mutateWith(mockUser("mutateWith-mockUser"))
.get()
.exchange()
.expectStatus().isOk()
.expectBody(String.class).consumeWith( response -> assertThat(response.getResponseBody()).contains("\"username\":\"mutateWith-mockUser\""));
client.mutateWith(mockUser("mutateWith-mockUser")).get().exchange().expectStatus().isOk()
.expectBody(String.class).consumeWith(response -> assertThat(response.getResponseBody())
.contains("\"username\":\"mutateWith-mockUser\""));
Principal principal = controller.removePrincipal();
assertPrincipalCreatedFromUserDetails(principal, userBuilder.username("mutateWith-mockUser").build());
}
}

View File

@@ -47,33 +47,26 @@ import static org.springframework.security.test.web.reactive.server.SecurityMock
*/
@RunWith(MockitoJUnitRunner.class)
public class SecurityMockServerConfigurersJwtTests extends AbstractMockServerConfigurersTests {
@Mock
GrantedAuthority authority1;
@Mock
GrantedAuthority authority2;
WebTestClient client = WebTestClient
.bindToController(securityContextController)
WebTestClient client = WebTestClient.bindToController(securityContextController)
.webFilter(new SecurityContextServerWebExchangeWebFilter())
.argumentResolvers(resolvers -> resolvers.addCustomResolver(
new CurrentSecurityContextArgumentResolver(new ReactiveAdapterRegistry())))
.apply(springSecurity())
.configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.build();
.argumentResolvers(resolvers -> resolvers
.addCustomResolver(new CurrentSecurityContextArgumentResolver(new ReactiveAdapterRegistry())))
.apply(springSecurity()).configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).build();
@Test
public void mockJwtWhenUsingDefaultsTheCreatesJwtAuthentication() {
client
.mutateWith(mockJwt())
.get()
.exchange()
.expectStatus().isOk();
client.mutateWith(mockJwt()).get().exchange().expectStatus().isOk();
SecurityContext context = securityContextController.removeSecurityContext();
assertThat(context.getAuthentication()).isInstanceOf(
JwtAuthenticationToken.class);
assertThat(context.getAuthentication()).isInstanceOf(JwtAuthenticationToken.class);
JwtAuthenticationToken token = (JwtAuthenticationToken) context.getAuthentication();
assertThat(token.getAuthorities()).isNotEmpty();
assertThat(token.getToken()).isNotNull();
@@ -84,79 +77,54 @@ public class SecurityMockServerConfigurersJwtTests extends AbstractMockServerCon
@Test
public void mockJwtWhenProvidingBuilderConsumerThenProducesJwtAuthentication() {
String name = new String("user");
client
.mutateWith(mockJwt().jwt(jwt -> jwt.subject(name)))
.get()
.exchange()
.expectStatus().isOk();
client.mutateWith(mockJwt().jwt(jwt -> jwt.subject(name))).get().exchange().expectStatus().isOk();
SecurityContext context = securityContextController.removeSecurityContext();
assertThat(context.getAuthentication()).isInstanceOf(
JwtAuthenticationToken.class);
assertThat(context.getAuthentication()).isInstanceOf(JwtAuthenticationToken.class);
JwtAuthenticationToken token = (JwtAuthenticationToken) context.getAuthentication();
assertThat(token.getToken().getSubject()).isSameAs(name);
}
@Test
public void mockJwtWhenProvidingCustomAuthoritiesThenProducesJwtAuthentication() {
client
.mutateWith(mockJwt().jwt(jwt -> jwt.claim("scope", "ignored authorities"))
.authorities(this.authority1, this.authority2))
.get()
.exchange()
.expectStatus().isOk();
client.mutateWith(mockJwt().jwt(jwt -> jwt.claim("scope", "ignored authorities")).authorities(this.authority1,
this.authority2)).get().exchange().expectStatus().isOk();
SecurityContext context = securityContextController.removeSecurityContext();
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities())
.containsOnly(this.authority1, this.authority2);
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities()).containsOnly(this.authority1,
this.authority2);
}
@Test
public void mockJwtWhenProvidingScopedAuthoritiesThenProducesJwtAuthentication() {
client
.mutateWith(mockJwt().jwt(jwt -> jwt.claim("scope", "scoped authorities")))
.get()
.exchange()
client.mutateWith(mockJwt().jwt(jwt -> jwt.claim("scope", "scoped authorities"))).get().exchange()
.expectStatus().isOk();
SecurityContext context = securityContextController.removeSecurityContext();
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities())
.containsOnly(new SimpleGrantedAuthority("SCOPE_scoped"),
new SimpleGrantedAuthority("SCOPE_authorities"));
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities()).containsOnly(
new SimpleGrantedAuthority("SCOPE_scoped"), new SimpleGrantedAuthority("SCOPE_authorities"));
}
@Test
public void mockJwtWhenProvidingGrantedAuthoritiesThenProducesJwtAuthentication() {
client
.mutateWith(mockJwt().jwt(jwt -> jwt.claim("scope", "ignored authorities"))
.authorities(jwt -> Arrays.asList(this.authority1)))
.get()
.exchange()
.expectStatus().isOk();
client.mutateWith(mockJwt().jwt(jwt -> jwt.claim("scope", "ignored authorities"))
.authorities(jwt -> Arrays.asList(this.authority1))).get().exchange().expectStatus().isOk();
SecurityContext context = securityContextController.removeSecurityContext();
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities())
.containsOnly(this.authority1);
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities()).containsOnly(this.authority1);
}
@Test
public void mockJwtWhenProvidingPreparedJwtThenProducesJwtAuthentication() {
Jwt originalToken = TestJwts.jwt()
.header("header1", "value1")
.subject("some_user")
.build();
this.client
.mutateWith(mockJwt().jwt(originalToken))
.get()
.exchange()
.expectStatus().isOk();
Jwt originalToken = TestJwts.jwt().header("header1", "value1").subject("some_user").build();
this.client.mutateWith(mockJwt().jwt(originalToken)).get().exchange().expectStatus().isOk();
SecurityContext context = securityContextController.removeSecurityContext();
assertThat(context.getAuthentication()).isInstanceOf(
JwtAuthenticationToken.class);
assertThat(context.getAuthentication()).isInstanceOf(JwtAuthenticationToken.class);
JwtAuthenticationToken retrievedToken = (JwtAuthenticationToken) context.getAuthentication();
assertThat(retrievedToken.getToken().getSubject()).isEqualTo("some_user");
assertThat(retrievedToken.getToken().getTokenValue()).isEqualTo("token");
assertThat(retrievedToken.getToken().getHeaders().get("header1")).isEqualTo("value1");
}
}

View File

@@ -54,6 +54,7 @@ import static org.springframework.security.test.web.reactive.server.SecurityMock
@RunWith(MockitoJUnitRunner.class)
public class SecurityMockServerConfigurersOAuth2ClientTests extends AbstractMockServerConfigurersTests {
private OAuth2LoginController controller = new OAuth2LoginController();
@Mock
@@ -66,36 +67,26 @@ public class SecurityMockServerConfigurersOAuth2ClientTests extends AbstractMock
@Before
public void setup() {
this.client = WebTestClient
.bindToController(this.controller)
.argumentResolvers(c -> c.addCustomResolver(
new OAuth2AuthorizedClientArgumentResolver
(this.clientRegistrationRepository, this.authorizedClientRepository)))
.webFilter(new SecurityContextServerWebExchangeWebFilter())
.apply(springSecurity())
.configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.build();
this.client = WebTestClient.bindToController(this.controller)
.argumentResolvers(c -> c.addCustomResolver(new OAuth2AuthorizedClientArgumentResolver(
this.clientRegistrationRepository, this.authorizedClientRepository)))
.webFilter(new SecurityContextServerWebExchangeWebFilter()).apply(springSecurity()).configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).build();
}
@Test
public void oauth2ClientWhenUsingDefaultsThenException()
throws Exception {
public void oauth2ClientWhenUsingDefaultsThenException() throws Exception {
WebHttpHandlerBuilder builder = WebHttpHandlerBuilder.webHandler(new DispatcherHandler());
assertThatCode(() -> mockOAuth2Client().beforeServerCreated(builder))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("ClientRegistration");
.isInstanceOf(IllegalArgumentException.class).hasMessageContaining("ClientRegistration");
}
@Test
public void oauth2ClientWhenUsingRegistrationIdThenProducesAuthorizedClient()
throws Exception {
public void oauth2ClientWhenUsingRegistrationIdThenProducesAuthorizedClient() throws Exception {
this.client.mutateWith(mockOAuth2Client("registration-id"))
.get().uri("/client")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOAuth2Client("registration-id")).get().uri("/client").exchange().expectStatus()
.isOk();
OAuth2AuthorizedClient client = this.controller.authorizedClient;
assertThat(client).isNotNull();
@@ -105,15 +96,12 @@ public class SecurityMockServerConfigurersOAuth2ClientTests extends AbstractMock
}
@Test
public void oauth2ClientWhenClientRegistrationThenUses()
throws Exception {
public void oauth2ClientWhenClientRegistrationThenUses() throws Exception {
ClientRegistration clientRegistration = clientRegistration()
.registrationId("registration-id").clientId("client-id").build();
this.client.mutateWith(mockOAuth2Client().clientRegistration(clientRegistration))
.get().uri("/client")
.exchange()
.expectStatus().isOk();
ClientRegistration clientRegistration = clientRegistration().registrationId("registration-id")
.clientId("client-id").build();
this.client.mutateWith(mockOAuth2Client().clientRegistration(clientRegistration)).get().uri("/client")
.exchange().expectStatus().isOk();
OAuth2AuthorizedClient client = this.controller.authorizedClient;
assertThat(client).isNotNull();
@@ -123,14 +111,10 @@ public class SecurityMockServerConfigurersOAuth2ClientTests extends AbstractMock
}
@Test
public void oauth2ClientWhenClientRegistrationConsumerThenUses()
throws Exception {
public void oauth2ClientWhenClientRegistrationConsumerThenUses() throws Exception {
this.client.mutateWith(mockOAuth2Client("registration-id")
.clientRegistration(c -> c.clientId("client-id")))
.get().uri("/client")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOAuth2Client("registration-id").clientRegistration(c -> c.clientId("client-id")))
.get().uri("/client").exchange().expectStatus().isOk();
OAuth2AuthorizedClient client = this.controller.authorizedClient;
assertThat(client).isNotNull();
@@ -142,24 +126,16 @@ public class SecurityMockServerConfigurersOAuth2ClientTests extends AbstractMock
@Test
public void oauth2ClientWhenPrincipalNameThenUses() throws Exception {
this.client.mutateWith(mockOAuth2Client("registration-id")
.principalName("test-subject"))
.get().uri("/client")
.exchange()
.expectStatus().isOk()
.expectBody(String.class).isEqualTo("test-subject");
this.client.mutateWith(mockOAuth2Client("registration-id").principalName("test-subject")).get().uri("/client")
.exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("test-subject");
}
@Test
public void oauth2ClientWhenAccessTokenThenUses()
throws Exception {
public void oauth2ClientWhenAccessTokenThenUses() throws Exception {
OAuth2AccessToken accessToken = noScopes();
this.client.mutateWith(mockOAuth2Client("registration-id")
.accessToken(accessToken))
.get().uri("/client")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOAuth2Client("registration-id").accessToken(accessToken)).get().uri("/client")
.exchange().expectStatus().isOk();
OAuth2AuthorizedClient client = this.controller.authorizedClient;
assertThat(client).isNotNull();
@@ -170,39 +146,36 @@ public class SecurityMockServerConfigurersOAuth2ClientTests extends AbstractMock
@Test
public void oauth2ClientWhenUsedOnceThenDoesNotAffectRemainingTests() throws Exception {
this.client.mutateWith(mockOAuth2Client("registration-id"))
.get().uri("/client")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOAuth2Client("registration-id")).get().uri("/client").exchange().expectStatus()
.isOk();
OAuth2AuthorizedClient client = this.controller.authorizedClient;
assertThat(client).isNotNull();
assertThat(client.getClientRegistration().getClientId()).isEqualTo("test-client");
client = new OAuth2AuthorizedClient(clientRegistration().build(), "sub", noScopes());
when(this.authorizedClientRepository
.loadAuthorizedClient(eq("registration-id"), any(Authentication.class), any(ServerWebExchange.class)))
.thenReturn(Mono.just(client));
this.client
.get().uri("/client")
.exchange()
.expectStatus().isOk();
when(this.authorizedClientRepository.loadAuthorizedClient(eq("registration-id"), any(Authentication.class),
any(ServerWebExchange.class))).thenReturn(Mono.just(client));
this.client.get().uri("/client").exchange().expectStatus().isOk();
client = this.controller.authorizedClient;
assertThat(client).isNotNull();
assertThat(client.getClientRegistration().getClientId()).isEqualTo("client-id");
verify(this.authorizedClientRepository).loadAuthorizedClient(
eq("registration-id"), any(Authentication.class), any(ServerWebExchange.class));
verify(this.authorizedClientRepository).loadAuthorizedClient(eq("registration-id"), any(Authentication.class),
any(ServerWebExchange.class));
}
@RestController
static class OAuth2LoginController {
volatile OAuth2AuthorizedClient authorizedClient;
@GetMapping("/client")
String authorizedClient
(@RegisteredOAuth2AuthorizedClient("registration-id") OAuth2AuthorizedClient authorizedClient) {
String authorizedClient(
@RegisteredOAuth2AuthorizedClient("registration-id") OAuth2AuthorizedClient authorizedClient) {
this.authorizedClient = authorizedClient;
return authorizedClient.getPrincipalName();
}
}
}

View File

@@ -49,6 +49,7 @@ import static org.springframework.security.test.web.reactive.server.SecurityMock
@RunWith(MockitoJUnitRunner.class)
public class SecurityMockServerConfigurersOAuth2LoginTests extends AbstractMockServerConfigurersTests {
private OAuth2LoginController controller = new OAuth2LoginController();
@Mock
@@ -61,41 +62,29 @@ public class SecurityMockServerConfigurersOAuth2LoginTests extends AbstractMockS
@Before
public void setup() {
this.client = WebTestClient
.bindToController(this.controller)
.argumentResolvers(c -> c.addCustomResolver(
new OAuth2AuthorizedClientArgumentResolver
(this.clientRegistrationRepository, this.authorizedClientRepository)))
.webFilter(new SecurityContextServerWebExchangeWebFilter())
.apply(springSecurity())
.configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.build();
this.client = WebTestClient.bindToController(this.controller)
.argumentResolvers(c -> c.addCustomResolver(new OAuth2AuthorizedClientArgumentResolver(
this.clientRegistrationRepository, this.authorizedClientRepository)))
.webFilter(new SecurityContextServerWebExchangeWebFilter()).apply(springSecurity()).configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).build();
}
@Test
public void oauth2LoginWhenUsingDefaultsThenProducesDefaultAuthentication() {
this.client.mutateWith(mockOAuth2Login())
.get().uri("/token")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOAuth2Login()).get().uri("/token").exchange().expectStatus().isOk();
OAuth2AuthenticationToken token = this.controller.token;
assertThat(token).isNotNull();
assertThat(token.getAuthorizedClientRegistrationId()).isEqualTo("test");
assertThat(token.getPrincipal()).isInstanceOf(OAuth2User.class);
assertThat(token.getPrincipal().getAttributes())
.containsEntry("sub", "user");
assertThat(token.getPrincipal().getAttributes()).containsEntry("sub", "user");
assertThat((Collection<GrantedAuthority>) token.getPrincipal().getAuthorities())
.contains(new SimpleGrantedAuthority("SCOPE_read"));
}
@Test
public void oauth2LoginWhenUsingDefaultsThenProducesDefaultAuthorizedClient() {
this.client.mutateWith(mockOAuth2Login())
.get().uri("/client")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOAuth2Login()).get().uri("/client").exchange().expectStatus().isOk();
OAuth2AuthorizedClient client = this.controller.authorizedClient;
assertThat(client).isNotNull();
@@ -106,11 +95,8 @@ public class SecurityMockServerConfigurersOAuth2LoginTests extends AbstractMockS
@Test
public void oauth2LoginWhenAuthoritiesSpecifiedThenGrantsAccess() {
this.client.mutateWith(mockOAuth2Login()
.authorities(new SimpleGrantedAuthority("SCOPE_admin")))
.get().uri("/token")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOAuth2Login().authorities(new SimpleGrantedAuthority("SCOPE_admin"))).get()
.uri("/token").exchange().expectStatus().isOk();
OAuth2AuthenticationToken token = this.controller.token;
assertThat((Collection<GrantedAuthority>) token.getPrincipal().getAuthorities())
@@ -119,78 +105,54 @@ public class SecurityMockServerConfigurersOAuth2LoginTests extends AbstractMockS
@Test
public void oauth2LoginWhenAttributeSpecifiedThenUserHasAttribute() {
this.client.mutateWith(mockOAuth2Login()
.attributes(a -> a.put("iss", "https://idp.example.org")))
.get().uri("/token")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOAuth2Login().attributes(a -> a.put("iss", "https://idp.example.org"))).get()
.uri("/token").exchange().expectStatus().isOk();
OAuth2AuthenticationToken token = this.controller.token;
assertThat(token.getPrincipal().getAttributes())
.containsEntry("iss", "https://idp.example.org");
assertThat(token.getPrincipal().getAttributes()).containsEntry("iss", "https://idp.example.org");
}
@Test
public void oauth2LoginWhenNameSpecifiedThenUserHasName() throws Exception {
OAuth2User oauth2User = new DefaultOAuth2User(
AuthorityUtils.commaSeparatedStringToAuthorityList("SCOPE_read"),
Collections.singletonMap("custom-attribute", "test-subject"),
"custom-attribute");
OAuth2User oauth2User = new DefaultOAuth2User(AuthorityUtils.commaSeparatedStringToAuthorityList("SCOPE_read"),
Collections.singletonMap("custom-attribute", "test-subject"), "custom-attribute");
this.client.mutateWith(mockOAuth2Login()
.oauth2User(oauth2User))
.get().uri("/token")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOAuth2Login().oauth2User(oauth2User)).get().uri("/token").exchange().expectStatus()
.isOk();
OAuth2AuthenticationToken token = this.controller.token;
assertThat(token.getPrincipal().getName())
.isEqualTo("test-subject");
assertThat(token.getPrincipal().getName()).isEqualTo("test-subject");
this.client.mutateWith(mockOAuth2Login()
.oauth2User(oauth2User))
.get().uri("/client")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOAuth2Login().oauth2User(oauth2User)).get().uri("/client").exchange().expectStatus()
.isOk();
OAuth2AuthorizedClient client = this.controller.authorizedClient;
assertThat(client.getPrincipalName())
.isEqualTo("test-subject");
assertThat(client.getPrincipalName()).isEqualTo("test-subject");
}
@Test
public void oauth2LoginWhenOAuth2UserSpecifiedThenLastCalledTakesPrecedence() throws Exception {
OAuth2User oauth2User = new DefaultOAuth2User(
AuthorityUtils.createAuthorityList("SCOPE_read"),
Collections.singletonMap("sub", "subject"),
"sub");
OAuth2User oauth2User = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("SCOPE_read"),
Collections.singletonMap("sub", "subject"), "sub");
this.client.mutateWith(mockOAuth2Login()
.attributes(a -> a.put("subject", "foo"))
.oauth2User(oauth2User))
.get().uri("/token")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOAuth2Login().attributes(a -> a.put("subject", "foo")).oauth2User(oauth2User)).get()
.uri("/token").exchange().expectStatus().isOk();
OAuth2AuthenticationToken token = this.controller.token;
assertThat(token.getPrincipal().getAttributes())
.containsEntry("sub", "subject");
assertThat(token.getPrincipal().getAttributes()).containsEntry("sub", "subject");
this.client.mutateWith(mockOAuth2Login()
.oauth2User(oauth2User)
.attributes(a -> a.put("sub", "bar")))
.get().uri("/token")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOAuth2Login().oauth2User(oauth2User).attributes(a -> a.put("sub", "bar"))).get()
.uri("/token").exchange().expectStatus().isOk();
token = this.controller.token;
assertThat(token.getPrincipal().getAttributes())
.containsEntry("sub", "bar");
assertThat(token.getPrincipal().getAttributes()).containsEntry("sub", "bar");
}
@RestController
static class OAuth2LoginController {
volatile OAuth2AuthenticationToken token;
volatile OAuth2AuthorizedClient authorizedClient;
@GetMapping("/token")
@@ -200,10 +162,11 @@ public class SecurityMockServerConfigurersOAuth2LoginTests extends AbstractMockS
}
@GetMapping("/client")
String authorizedClient
(@RegisteredOAuth2AuthorizedClient OAuth2AuthorizedClient authorizedClient) {
String authorizedClient(@RegisteredOAuth2AuthorizedClient OAuth2AuthorizedClient authorizedClient) {
this.authorizedClient = authorizedClient;
return authorizedClient.getPrincipalName();
}
}
}

View File

@@ -51,6 +51,7 @@ import static org.springframework.security.test.web.reactive.server.SecurityMock
@RunWith(MockitoJUnitRunner.class)
public class SecurityMockServerConfigurersOidcLoginTests extends AbstractMockServerConfigurersTests {
private OAuth2LoginController controller = new OAuth2LoginController();
@Mock
@@ -63,43 +64,30 @@ public class SecurityMockServerConfigurersOidcLoginTests extends AbstractMockSer
@Before
public void setup() {
this.client = WebTestClient
.bindToController(this.controller)
.argumentResolvers(c -> c.addCustomResolver(
new OAuth2AuthorizedClientArgumentResolver
(this.clientRegistrationRepository, this.authorizedClientRepository)))
.webFilter(new SecurityContextServerWebExchangeWebFilter())
.apply(springSecurity())
.configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.build();
this.client = WebTestClient.bindToController(this.controller)
.argumentResolvers(c -> c.addCustomResolver(new OAuth2AuthorizedClientArgumentResolver(
this.clientRegistrationRepository, this.authorizedClientRepository)))
.webFilter(new SecurityContextServerWebExchangeWebFilter()).apply(springSecurity()).configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).build();
}
@Test
public void oidcLoginWhenUsingDefaultsThenProducesDefaultAuthentication() {
this.client.mutateWith(mockOidcLogin())
.get().uri("/token")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOidcLogin()).get().uri("/token").exchange().expectStatus().isOk();
OAuth2AuthenticationToken token = this.controller.token;
assertThat(token).isNotNull();
assertThat(token.getAuthorizedClientRegistrationId()).isEqualTo("test");
assertThat(token.getPrincipal()).isInstanceOf(OidcUser.class);
assertThat(token.getPrincipal().getAttributes())
.containsEntry("sub", "user");
assertThat(token.getPrincipal().getAttributes()).containsEntry("sub", "user");
assertThat((Collection<GrantedAuthority>) token.getPrincipal().getAuthorities())
.contains(new SimpleGrantedAuthority("SCOPE_read"));
assertThat(((OidcUser) token.getPrincipal()).getIdToken().getTokenValue())
.isEqualTo("id-token");
assertThat(((OidcUser) token.getPrincipal()).getIdToken().getTokenValue()).isEqualTo("id-token");
}
@Test
public void oidcLoginWhenUsingDefaultsThenProducesDefaultAuthorizedClient() {
this.client.mutateWith(mockOidcLogin())
.get().uri("/client")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOidcLogin()).get().uri("/client").exchange().expectStatus().isOk();
OAuth2AuthorizedClient client = this.controller.authorizedClient;
assertThat(client).isNotNull();
@@ -110,11 +98,8 @@ public class SecurityMockServerConfigurersOidcLoginTests extends AbstractMockSer
@Test
public void oidcLoginWhenAuthoritiesSpecifiedThenGrantsAccess() {
this.client.mutateWith(mockOidcLogin()
.authorities(new SimpleGrantedAuthority("SCOPE_admin")))
.get().uri("/token")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOidcLogin().authorities(new SimpleGrantedAuthority("SCOPE_admin"))).get()
.uri("/token").exchange().expectStatus().isOk();
OAuth2AuthenticationToken token = this.controller.token;
assertThat((Collection<GrantedAuthority>) token.getPrincipal().getAuthorities())
@@ -123,90 +108,64 @@ public class SecurityMockServerConfigurersOidcLoginTests extends AbstractMockSer
@Test
public void oidcLoginWhenIdTokenSpecifiedThenUserHasClaims() {
this.client.mutateWith(mockOidcLogin()
.idToken(i -> i.issuer("https://idp.example.org")))
.get().uri("/token")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOidcLogin().idToken(i -> i.issuer("https://idp.example.org"))).get().uri("/token")
.exchange().expectStatus().isOk();
OAuth2AuthenticationToken token = this.controller.token;
assertThat(token.getPrincipal().getAttributes())
.containsEntry("iss", "https://idp.example.org");
assertThat(token.getPrincipal().getAttributes()).containsEntry("iss", "https://idp.example.org");
}
@Test
public void oidcLoginWhenUserInfoSpecifiedThenUserHasClaims() throws Exception {
this.client.mutateWith(mockOidcLogin()
.userInfoToken(u -> u.email("email@email")))
.get().uri("/token")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOidcLogin().userInfoToken(u -> u.email("email@email"))).get().uri("/token")
.exchange().expectStatus().isOk();
OAuth2AuthenticationToken token = this.controller.token;
assertThat(token.getPrincipal().getAttributes())
.containsEntry("email", "email@email");
assertThat(token.getPrincipal().getAttributes()).containsEntry("email", "email@email");
}
@Test
public void oidcUserWhenNameSpecifiedThenUserHasName() throws Exception {
OidcUser oidcUser = new DefaultOidcUser(
AuthorityUtils.commaSeparatedStringToAuthorityList("SCOPE_read"),
OidcUser oidcUser = new DefaultOidcUser(AuthorityUtils.commaSeparatedStringToAuthorityList("SCOPE_read"),
OidcIdToken.withTokenValue("id-token").claim("custom-attribute", "test-subject").build(),
"custom-attribute");
this.client.mutateWith(mockOAuth2Login()
.oauth2User(oidcUser))
.get().uri("/token")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOAuth2Login().oauth2User(oidcUser)).get().uri("/token").exchange().expectStatus()
.isOk();
OAuth2AuthenticationToken token = this.controller.token;
assertThat(token.getPrincipal().getName())
.isEqualTo("test-subject");
assertThat(token.getPrincipal().getName()).isEqualTo("test-subject");
this.client.mutateWith(mockOAuth2Login()
.oauth2User(oidcUser))
.get().uri("/client")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOAuth2Login().oauth2User(oidcUser)).get().uri("/client").exchange().expectStatus()
.isOk();
OAuth2AuthorizedClient client = this.controller.authorizedClient;
assertThat(client.getPrincipalName())
.isEqualTo("test-subject");
assertThat(client.getPrincipalName()).isEqualTo("test-subject");
}
// gh-7794
@Test
public void oidcLoginWhenOidcUserSpecifiedThenLastCalledTakesPrecedence() throws Exception {
OidcUser oidcUser = new DefaultOidcUser(
AuthorityUtils.createAuthorityList("SCOPE_read"), idToken().build());
OidcUser oidcUser = new DefaultOidcUser(AuthorityUtils.createAuthorityList("SCOPE_read"), idToken().build());
this.client.mutateWith(mockOidcLogin()
.idToken(i -> i.subject("foo"))
.oidcUser(oidcUser))
.get().uri("/token")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOidcLogin().idToken(i -> i.subject("foo")).oidcUser(oidcUser)).get().uri("/token")
.exchange().expectStatus().isOk();
OAuth2AuthenticationToken token = this.controller.token;
assertThat(token.getPrincipal().getAttributes())
.containsEntry("sub", "subject");
assertThat(token.getPrincipal().getAttributes()).containsEntry("sub", "subject");
this.client.mutateWith(mockOidcLogin()
.oidcUser(oidcUser)
.idToken(i -> i.subject("bar")))
.get().uri("/token")
.exchange()
.expectStatus().isOk();
this.client.mutateWith(mockOidcLogin().oidcUser(oidcUser).idToken(i -> i.subject("bar"))).get().uri("/token")
.exchange().expectStatus().isOk();
token = this.controller.token;
assertThat(token.getPrincipal().getAttributes())
.containsEntry("sub", "bar");
assertThat(token.getPrincipal().getAttributes()).containsEntry("sub", "bar");
}
@RestController
static class OAuth2LoginController {
volatile OAuth2AuthenticationToken token;
volatile OAuth2AuthorizedClient authorizedClient;
@GetMapping("/token")
@@ -216,10 +175,11 @@ public class SecurityMockServerConfigurersOidcLoginTests extends AbstractMockSer
}
@GetMapping("/client")
String authorizedClient
(@RegisteredOAuth2AuthorizedClient OAuth2AuthorizedClient authorizedClient) {
String authorizedClient(@RegisteredOAuth2AuthorizedClient OAuth2AuthorizedClient authorizedClient) {
this.authorizedClient = authorizedClient;
return authorizedClient.getPrincipalName();
}
}
}

View File

@@ -37,50 +37,33 @@ import static org.springframework.security.test.web.reactive.server.SecurityMock
* @since 5.0
*/
public class SecurityMockServerConfigurersTests extends AbstractMockServerConfigurersTests {
WebTestClient client = WebTestClient
.bindToController(controller)
.webFilter( new CsrfWebFilter(), new SecurityContextServerWebExchangeWebFilter())
.apply(springSecurity())
.configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.build();
WebTestClient client = WebTestClient.bindToController(controller)
.webFilter(new CsrfWebFilter(), new SecurityContextServerWebExchangeWebFilter()).apply(springSecurity())
.configureClient().defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).build();
@Test
public void mockAuthenticationWhenLocalThenSuccess() {
TestingAuthenticationToken authentication = new TestingAuthenticationToken("authentication", "secret", "ROLE_USER");
client
.mutateWith(mockAuthentication(authentication))
.get()
.exchange()
.expectStatus().isOk();
TestingAuthenticationToken authentication = new TestingAuthenticationToken("authentication", "secret",
"ROLE_USER");
client.mutateWith(mockAuthentication(authentication)).get().exchange().expectStatus().isOk();
controller.assertPrincipalIsEqualTo(authentication);
}
@Test
public void mockAuthenticationWhenGlobalThenSuccess() {
TestingAuthenticationToken authentication = new TestingAuthenticationToken("authentication", "secret", "ROLE_USER");
client = WebTestClient
.bindToController(controller)
.webFilter(new SecurityContextServerWebExchangeWebFilter())
.apply(springSecurity())
.apply(mockAuthentication(authentication))
.configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.build();
client
.get()
.exchange()
.expectStatus().isOk();
TestingAuthenticationToken authentication = new TestingAuthenticationToken("authentication", "secret",
"ROLE_USER");
client = WebTestClient.bindToController(controller).webFilter(new SecurityContextServerWebExchangeWebFilter())
.apply(springSecurity()).apply(mockAuthentication(authentication)).configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).build();
client.get().exchange().expectStatus().isOk();
controller.assertPrincipalIsEqualTo(authentication);
}
@Test
public void mockUserWhenDefaultsThenSuccess() {
client
.mutateWith(mockUser())
.get()
.exchange()
.expectStatus().isOk();
client.mutateWith(mockUser()).get().exchange().expectStatus().isOk();
Principal actual = controller.removePrincipal();
@@ -89,18 +72,10 @@ public class SecurityMockServerConfigurersTests extends AbstractMockServerConfig
@Test
public void mockUserWhenGlobalThenSuccess() {
client = WebTestClient
.bindToController(controller)
.webFilter(new SecurityContextServerWebExchangeWebFilter())
.apply(springSecurity())
.apply(mockUser())
.configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.build();
client
.get()
.exchange()
.expectStatus().isOk();
client = WebTestClient.bindToController(controller).webFilter(new SecurityContextServerWebExchangeWebFilter())
.apply(springSecurity()).apply(mockUser()).configureClient()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).build();
client.get().exchange().expectStatus().isOk();
Principal actual = controller.removePrincipal();
@@ -109,11 +84,7 @@ public class SecurityMockServerConfigurersTests extends AbstractMockServerConfig
@Test
public void mockUserStringWhenLocalThenSuccess() {
client
.mutateWith(mockUser(userBuilder.build().getUsername()))
.get()
.exchange()
.expectStatus().isOk();
client.mutateWith(mockUser(userBuilder.build().getUsername())).get().exchange().expectStatus().isOk();
Principal actual = controller.removePrincipal();
@@ -123,11 +94,8 @@ public class SecurityMockServerConfigurersTests extends AbstractMockServerConfig
@Test
public void mockUserStringWhenCustomThenSuccess() {
this.userBuilder = User.withUsername("admin").password("secret").roles("USER", "ADMIN");
client
.mutateWith(mockUser("admin").password("secret").roles("USER", "ADMIN"))
.get()
.exchange()
.expectStatus().isOk();
client.mutateWith(mockUser("admin").password("secret").roles("USER", "ADMIN")).get().exchange().expectStatus()
.isOk();
Principal actual = controller.removePrincipal();
@@ -137,11 +105,7 @@ public class SecurityMockServerConfigurersTests extends AbstractMockServerConfig
@Test
public void mockUserUserDetailsLocalThenSuccess() {
UserDetails userDetails = this.userBuilder.build();
client
.mutateWith(mockUser(userDetails))
.get()
.exchange()
.expectStatus().isOk();
client.mutateWith(mockUser(userDetails)).get().exchange().expectStatus().isOk();
Principal actual = controller.removePrincipal();
@@ -150,34 +114,20 @@ public class SecurityMockServerConfigurersTests extends AbstractMockServerConfig
@Test
public void csrfWhenMutateWithThenDisablesCsrf() {
this.client
.post()
.exchange()
.expectStatus().isEqualTo(HttpStatus.FORBIDDEN)
.expectBody().consumeWith( b -> assertThat(new String(b.getResponseBody())).contains("CSRF"));
this.client.post().exchange().expectStatus().isEqualTo(HttpStatus.FORBIDDEN).expectBody()
.consumeWith(b -> assertThat(new String(b.getResponseBody())).contains("CSRF"));
this.client
.mutateWith(csrf())
.post()
.exchange()
.expectStatus().isOk();
this.client.mutateWith(csrf()).post().exchange().expectStatus().isOk();
}
@Test
public void csrfWhenGlobalThenDisablesCsrf() {
this.client = WebTestClient
.bindToController(this.controller)
.webFilter(new CsrfWebFilter())
.apply(springSecurity())
.apply(csrf())
.configureClient()
.build();
this.client = WebTestClient.bindToController(this.controller).webFilter(new CsrfWebFilter())
.apply(springSecurity()).apply(csrf()).configureClient().build();
this.client
.get()
.exchange()
.expectStatus().isOk();
this.client.get().exchange().expectStatus().isOk();
}
}

View File

@@ -44,7 +44,6 @@ import org.springframework.web.context.WebApplicationContext;
* @author Rob Winch
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
@@ -57,89 +56,62 @@ public class Sec2935Tests {
@Before
public void setup() {
mvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity())
.build();
mvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build();
}
// SEC-2935
@Test
public void postProcessorUserNoUser() throws Exception {
mvc
.perform(get("/admin/abc").with(user("user").roles("ADMIN", "USER")))
.andExpect(status().isNotFound())
.andExpect(authenticated().withUsername("user"));
mvc.perform(get("/admin/abc").with(user("user").roles("ADMIN", "USER"))).andExpect(status().isNotFound())
.andExpect(authenticated().withUsername("user"));
mvc
.perform(get("/admin/abc"))
.andExpect(status().isUnauthorized())
.andExpect(unauthenticated());
mvc.perform(get("/admin/abc")).andExpect(status().isUnauthorized()).andExpect(unauthenticated());
}
@Test
public void postProcessorUserOtherUser() throws Exception {
mvc
.perform(get("/admin/abc").with(user("user1").roles("ADMIN", "USER")))
.andExpect(status().isNotFound())
.andExpect(authenticated().withUsername("user1"));
mvc.perform(get("/admin/abc").with(user("user1").roles("ADMIN", "USER"))).andExpect(status().isNotFound())
.andExpect(authenticated().withUsername("user1"));
mvc
.perform(get("/admin/abc").with(user("user2").roles("USER")))
.andExpect(status().isForbidden())
.andExpect(authenticated().withUsername("user2"));
mvc.perform(get("/admin/abc").with(user("user2").roles("USER"))).andExpect(status().isForbidden())
.andExpect(authenticated().withUsername("user2"));
}
@WithMockUser
@Test
public void postProcessorUserWithMockUser() throws Exception {
mvc
.perform(get("/admin/abc").with(user("user1").roles("ADMIN", "USER")))
.andExpect(status().isNotFound())
.andExpect(authenticated().withUsername("user1"));
mvc.perform(get("/admin/abc").with(user("user1").roles("ADMIN", "USER"))).andExpect(status().isNotFound())
.andExpect(authenticated().withUsername("user1"));
mvc
.perform(get("/admin/abc"))
.andExpect(status().isForbidden())
.andExpect(authenticated().withUsername("user"));
mvc.perform(get("/admin/abc")).andExpect(status().isForbidden())
.andExpect(authenticated().withUsername("user"));
}
// SEC-2941
@Test
public void defaultRequest() throws Exception {
mvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity())
.defaultRequest(get("/").with(user("default")))
.build();
mvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity())
.defaultRequest(get("/").with(user("default"))).build();
mvc
.perform(get("/admin/abc").with(user("user1").roles("ADMIN", "USER")))
.andExpect(status().isNotFound())
.andExpect(authenticated().withUsername("user1"));
mvc.perform(get("/admin/abc").with(user("user1").roles("ADMIN", "USER"))).andExpect(status().isNotFound())
.andExpect(authenticated().withUsername("user1"));
mvc
.perform(get("/admin/abc"))
.andExpect(status().isForbidden())
.andExpect(authenticated().withUsername("default"));
mvc.perform(get("/admin/abc")).andExpect(status().isForbidden())
.andExpect(authenticated().withUsername("default"));
}
@Ignore
@WithMockUser
@Test
public void defaultRequestOverridesWithMockUser() throws Exception {
mvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity())
.defaultRequest(get("/").with(user("default")))
.build();
mvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity())
.defaultRequest(get("/").with(user("default"))).build();
mvc
.perform(get("/admin/abc").with(user("user1").roles("ADMIN", "USER")))
.andExpect(status().isNotFound())
.andExpect(authenticated().withUsername("user1"));
mvc.perform(get("/admin/abc").with(user("user1").roles("ADMIN", "USER"))).andExpect(status().isNotFound())
.andExpect(authenticated().withUsername("user1"));
mvc
.perform(get("/admin/abc"))
.andExpect(status().isForbidden())
.andExpect(authenticated().withUsername("default"));
mvc.perform(get("/admin/abc")).andExpect(status().isForbidden())
.andExpect(authenticated().withUsername("default"));
}
@EnableWebSecurity
@@ -162,5 +134,7 @@ public class Sec2935Tests {
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication();
}
}
}

View File

@@ -39,6 +39,7 @@ import static org.powermock.api.mockito.PowerMockito.when;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.formLogin;
public class SecurityMockMvcRequestBuildersFormLoginTests {
private MockServletContext servletContext;
@Before
@@ -55,16 +56,15 @@ public class SecurityMockMvcRequestBuildersFormLoginTests {
assertThat(request.getParameter("username")).isEqualTo("user");
assertThat(request.getParameter("password")).isEqualTo("password");
assertThat(request.getMethod()).isEqualTo("POST");
assertThat(request.getParameter(token.getParameterName()))
.isEqualTo(token.getToken());
assertThat(request.getParameter(token.getParameterName())).isEqualTo(token.getToken());
assertThat(request.getRequestURI()).isEqualTo("/login");
assertThat(request.getParameter("_csrf")).isNotNull();
}
@Test
public void custom() {
MockHttpServletRequest request = formLogin("/login").user("username", "admin")
.password("password", "secret").buildRequest(this.servletContext);
MockHttpServletRequest request = formLogin("/login").user("username", "admin").password("password", "secret")
.buildRequest(this.servletContext);
CsrfToken token = (CsrfToken) request
.getAttribute(CsrfRequestPostProcessor.TestCsrfTokenRepository.TOKEN_ATTR_NAME);
@@ -72,8 +72,7 @@ public class SecurityMockMvcRequestBuildersFormLoginTests {
assertThat(request.getParameter("username")).isEqualTo("admin");
assertThat(request.getParameter("password")).isEqualTo("secret");
assertThat(request.getMethod()).isEqualTo("POST");
assertThat(request.getParameter(token.getParameterName()))
.isEqualTo(token.getToken());
assertThat(request.getParameter(token.getParameterName())).isEqualTo(token.getToken());
assertThat(request.getRequestURI()).isEqualTo("/login");
}
@@ -88,14 +87,13 @@ public class SecurityMockMvcRequestBuildersFormLoginTests {
assertThat(request.getParameter("username")).isEqualTo("admin");
assertThat(request.getParameter("password")).isEqualTo("secret");
assertThat(request.getMethod()).isEqualTo("POST");
assertThat(request.getParameter(token.getParameterName()))
.isEqualTo(token.getToken());
assertThat(request.getParameter(token.getParameterName())).isEqualTo(token.getToken());
assertThat(request.getRequestURI()).isEqualTo("/uri-login/val1/val2");
}
/**
* spring-restdocs uses postprocessors to do its trick. It will work only if these are merged together
* with our request builders. (gh-7572)
* spring-restdocs uses postprocessors to do its trick. It will work only if these are
* merged together with our request builders. (gh-7572)
* @throws Exception
*/
@Test
@@ -103,9 +101,7 @@ public class SecurityMockMvcRequestBuildersFormLoginTests {
RequestPostProcessor postProcessor = mock(RequestPostProcessor.class);
when(postProcessor.postProcessRequest(any())).thenAnswer(i -> i.getArgument(0));
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new Object())
.defaultRequest(MockMvcRequestBuilders.get("/").with(postProcessor))
.build();
.defaultRequest(MockMvcRequestBuilders.get("/").with(postProcessor)).build();
MvcResult mvcResult = mockMvc.perform(formLogin()).andReturn();
assertThat(mvcResult.getRequest().getMethod()).isEqualTo(HttpMethod.POST.name());
@@ -121,10 +117,10 @@ public class SecurityMockMvcRequestBuildersFormLoginTests {
// gh-3920
@Test
public void usesAcceptMediaForContentNegotiation() {
MockHttpServletRequest request = formLogin("/login").user("username", "admin")
.password("password", "secret").buildRequest(this.servletContext);
MockHttpServletRequest request = formLogin("/login").user("username", "admin").password("password", "secret")
.buildRequest(this.servletContext);
assertThat(request.getHeader("Accept"))
.isEqualTo(MediaType.APPLICATION_FORM_URLENCODED_VALUE);
assertThat(request.getHeader("Accept")).isEqualTo(MediaType.APPLICATION_FORM_URLENCODED_VALUE);
}
}

View File

@@ -39,6 +39,7 @@ import static org.powermock.api.mockito.PowerMockito.when;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.logout;
public class SecurityMockMvcRequestBuildersFormLogoutTests {
private MockServletContext servletContext;
@Before
@@ -50,43 +51,42 @@ public class SecurityMockMvcRequestBuildersFormLogoutTests {
public void defaults() {
MockHttpServletRequest request = logout().buildRequest(servletContext);
CsrfToken token = (CsrfToken) request.getAttribute(CsrfRequestPostProcessor.TestCsrfTokenRepository.TOKEN_ATTR_NAME);
CsrfToken token = (CsrfToken) request
.getAttribute(CsrfRequestPostProcessor.TestCsrfTokenRepository.TOKEN_ATTR_NAME);
assertThat(request.getMethod()).isEqualTo("POST");
assertThat(request.getParameter(token.getParameterName())).isEqualTo(
token.getToken());
assertThat(request.getParameter(token.getParameterName())).isEqualTo(token.getToken());
assertThat(request.getRequestURI()).isEqualTo("/logout");
}
@Test
public void custom() {
MockHttpServletRequest request = logout("/admin/logout").buildRequest(
servletContext);
MockHttpServletRequest request = logout("/admin/logout").buildRequest(servletContext);
CsrfToken token = (CsrfToken) request.getAttribute(CsrfRequestPostProcessor.TestCsrfTokenRepository.TOKEN_ATTR_NAME);
CsrfToken token = (CsrfToken) request
.getAttribute(CsrfRequestPostProcessor.TestCsrfTokenRepository.TOKEN_ATTR_NAME);
assertThat(request.getMethod()).isEqualTo("POST");
assertThat(request.getParameter(token.getParameterName())).isEqualTo(
token.getToken());
assertThat(request.getParameter(token.getParameterName())).isEqualTo(token.getToken());
assertThat(request.getRequestURI()).isEqualTo("/admin/logout");
}
@Test
public void customWithUriVars() {
MockHttpServletRequest request = logout().logoutUrl("/uri-logout/{var1}/{var2}", "val1", "val2").buildRequest(
servletContext);
MockHttpServletRequest request = logout().logoutUrl("/uri-logout/{var1}/{var2}", "val1", "val2")
.buildRequest(servletContext);
CsrfToken token = (CsrfToken) request.getAttribute(CsrfRequestPostProcessor.TestCsrfTokenRepository.TOKEN_ATTR_NAME);
CsrfToken token = (CsrfToken) request
.getAttribute(CsrfRequestPostProcessor.TestCsrfTokenRepository.TOKEN_ATTR_NAME);
assertThat(request.getMethod()).isEqualTo("POST");
assertThat(request.getParameter(token.getParameterName())).isEqualTo(
token.getToken());
assertThat(request.getParameter(token.getParameterName())).isEqualTo(token.getToken());
assertThat(request.getRequestURI()).isEqualTo("/uri-logout/val1/val2");
}
/**
* spring-restdocs uses postprocessors to do its trick. It will work only if these are merged together
* with our request builders. (gh-7572)
* spring-restdocs uses postprocessors to do its trick. It will work only if these are
* merged together with our request builders. (gh-7572)
* @throws Exception
*/
@Test
@@ -94,8 +94,7 @@ public class SecurityMockMvcRequestBuildersFormLogoutTests {
RequestPostProcessor postProcessor = mock(RequestPostProcessor.class);
when(postProcessor.postProcessRequest(any())).thenAnswer(i -> i.getArgument(0));
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new Object())
.defaultRequest(MockMvcRequestBuilders.get("/").with(postProcessor))
.build();
.defaultRequest(MockMvcRequestBuilders.get("/").with(postProcessor)).build();
MvcResult mvcResult = mockMvc.perform(logout()).andReturn();
assertThat(mvcResult.getRequest().getMethod()).isEqualTo(HttpMethod.POST.name());
@@ -105,4 +104,5 @@ public class SecurityMockMvcRequestBuildersFormLogoutTests {
assertThat(mvcResult.getRequest().getParameter("_csrf")).isNotEmpty();
verify(postProcessor).postProcessRequest(any());
}
}

View File

@@ -92,10 +92,14 @@ public class SecurityMockMvcRequestPostProcessorsAuthenticationStatelessTests {
@RestController
static class Controller {
@RequestMapping
public String hello() {
return "Hello";
}
}
}
}

View File

@@ -44,10 +44,13 @@ import org.springframework.security.web.context.SecurityContextRepository;
@RunWith(PowerMockRunner.class)
@PrepareOnlyThisForTest(WebTestUtils.class)
@PowerMockIgnore({"javax.security.auth.*", "org.w3c.dom.*", "org.xml.sax.*", "org.apache.xerces.*", "javax.xml.parsers.*"})
@PowerMockIgnore({ "javax.security.auth.*", "org.w3c.dom.*", "org.xml.sax.*", "org.apache.xerces.*",
"javax.xml.parsers.*" })
public class SecurityMockMvcRequestPostProcessorsAuthenticationTests {
@Captor
private ArgumentCaptor<SecurityContext> contextCaptor;
@Mock
private SecurityContextRepository repository;
@@ -71,8 +74,7 @@ public class SecurityMockMvcRequestPostProcessorsAuthenticationTests {
public void userDetails() {
authentication(authentication).postProcessRequest(request);
verify(repository).saveContext(contextCaptor.capture(), eq(request),
any(HttpServletResponse.class));
verify(repository).saveContext(contextCaptor.capture(), eq(request), any(HttpServletResponse.class));
SecurityContext context = contextCaptor.getValue();
assertThat(context.getAuthentication()).isSameAs(authentication);
}
@@ -81,4 +83,5 @@ public class SecurityMockMvcRequestPostProcessorsAuthenticationTests {
spy(WebTestUtils.class);
when(WebTestUtils.getSecurityContextRepository(request)).thenReturn(repository);
}
}

View File

@@ -29,6 +29,7 @@ import static org.springframework.security.test.web.servlet.request.SecurityMock
@RunWith(MockitoJUnitRunner.class)
public class SecurityMockMvcRequestPostProcessorsCertificateTests {
@Mock
private X509Certificate certificate;
@@ -41,8 +42,7 @@ public class SecurityMockMvcRequestPostProcessorsCertificateTests {
@Test
public void x509SingleCertificate() {
MockHttpServletRequest postProcessedRequest = x509(certificate)
.postProcessRequest(request);
MockHttpServletRequest postProcessedRequest = x509(certificate).postProcessRequest(request);
X509Certificate[] certificates = (X509Certificate[]) postProcessedRequest
.getAttribute("javax.servlet.request.X509Certificate");
@@ -52,14 +52,14 @@ public class SecurityMockMvcRequestPostProcessorsCertificateTests {
@Test
public void x509ResourceName() throws Exception {
MockHttpServletRequest postProcessedRequest = x509("rod.cer").postProcessRequest(
request);
MockHttpServletRequest postProcessedRequest = x509("rod.cer").postProcessRequest(request);
X509Certificate[] certificates = (X509Certificate[]) postProcessedRequest
.getAttribute("javax.servlet.request.X509Certificate");
assertThat(certificates).hasSize(1);
assertThat(certificates[0].getSubjectDN().getName()).isEqualTo(
"CN=rod, OU=Spring Security, O=Spring Framework");
assertThat(certificates[0].getSubjectDN().getName())
.isEqualTo("CN=rod, OU=Spring Security, O=Spring Framework");
}
}

View File

@@ -53,6 +53,7 @@ public class SecurityMockMvcRequestPostProcessorsCsrfDebugFilterTests {
@EnableWebSecurity
static class Config extends WebSecurityConfigurerAdapter {
static CsrfTokenRepository cookieCsrfTokenRepository = new CookieCsrfTokenRepository();
@Override
@@ -65,5 +66,7 @@ public class SecurityMockMvcRequestPostProcessorsCsrfDebugFilterTests {
// Enable the DebugFilter
web.debug(true);
}
}
}

View File

@@ -62,10 +62,13 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@ContextConfiguration
@WebAppConfiguration
public class SecurityMockMvcRequestPostProcessorsCsrfTests {
@Autowired
WebApplicationContext wac;
@Autowired
TheController controller;
@Autowired
FilterChainProxy springSecurityFilterChain;
@@ -177,6 +180,7 @@ public class SecurityMockMvcRequestPostProcessorsCsrfTests {
assertThat(request.getParameter("_csrf")).isNotNull();
assertThat(request.getHeader("X-CSRF-TOKEN")).isNull();
}
}
public static ResultMatcher csrfAsHeader() {
@@ -191,18 +195,19 @@ public class SecurityMockMvcRequestPostProcessorsCsrfTests {
assertThat(request.getParameter("_csrf")).isNull();
assertThat(request.getHeader("X-CSRF-TOKEN")).isNotNull();
}
}
static class SessionRepositoryFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
filterChain.doFilter(new SessionRequestWrapper(request), response);
}
static class SessionRequestWrapper extends HttpServletRequestWrapper {
HttpSession session = new MockHttpSession();
SessionRequestWrapper(HttpServletRequest request) {
@@ -218,21 +223,28 @@ public class SecurityMockMvcRequestPostProcessorsCsrfTests {
public HttpSession getSession() {
return this.session;
}
}
}
@EnableWebSecurity
static class Config extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) {
}
@RestController
static class TheController {
@RequestMapping("/")
String index() {
return "Hi";
}
}
}
}

View File

@@ -39,6 +39,7 @@ import static org.springframework.security.test.web.servlet.request.SecurityMock
public class SecurityMockMvcRequestPostProcessorsDigestTests {
private DigestAuthenticationFilter filter;
private MockHttpServletRequest request;
private String username;
@@ -56,8 +57,8 @@ public class SecurityMockMvcRequestPostProcessorsDigestTests {
entryPoint.setKey("key");
entryPoint.setRealmName("Spring Security");
filter = new DigestAuthenticationFilter();
filter.setUserDetailsService(username -> new User(username, password, AuthorityUtils
.createAuthorityList("ROLE_USER")));
filter.setUserDetailsService(
username -> new User(username, password, AuthorityUtils.createAuthorityList("ROLE_USER")));
filter.setAuthenticationEntryPoint(entryPoint);
filter.afterPropertiesSet();
}
@@ -69,8 +70,7 @@ public class SecurityMockMvcRequestPostProcessorsDigestTests {
@Test
public void digestWithFilter() throws Exception {
MockHttpServletRequest postProcessedRequest = digest()
.postProcessRequest(request);
MockHttpServletRequest postProcessedRequest = digest().postProcessRequest(request);
assertThat(extractUser()).isEqualTo("user");
}
@@ -78,8 +78,7 @@ public class SecurityMockMvcRequestPostProcessorsDigestTests {
@Test
public void digestWithFilterCustomUsername() throws Exception {
String username = "admin";
MockHttpServletRequest postProcessedRequest = digest(username)
.postProcessRequest(request);
MockHttpServletRequest postProcessedRequest = digest(username).postProcessRequest(request);
assertThat(extractUser()).isEqualTo(username);
}
@@ -88,8 +87,7 @@ public class SecurityMockMvcRequestPostProcessorsDigestTests {
public void digestWithFilterCustomPassword() throws Exception {
String username = "custom";
password = "secret";
MockHttpServletRequest postProcessedRequest = digest(username).password(password)
.postProcessRequest(request);
MockHttpServletRequest postProcessedRequest = digest(username).password(password).postProcessRequest(request);
assertThat(extractUser()).isEqualTo(username);
}
@@ -98,8 +96,8 @@ public class SecurityMockMvcRequestPostProcessorsDigestTests {
public void digestWithFilterCustomRealm() throws Exception {
String username = "admin";
entryPoint.setRealmName("Custom");
MockHttpServletRequest postProcessedRequest = digest(username).realm(
entryPoint.getRealmName()).postProcessRequest(request);
MockHttpServletRequest postProcessedRequest = digest(username).realm(entryPoint.getRealmName())
.postProcessRequest(request);
assertThat(extractUser()).isEqualTo(username);
}
@@ -107,8 +105,7 @@ public class SecurityMockMvcRequestPostProcessorsDigestTests {
@Test
public void digestWithFilterFails() throws Exception {
String username = "admin";
MockHttpServletRequest postProcessedRequest = digest(username).realm("Invalid")
.postProcessRequest(request);
MockHttpServletRequest postProcessedRequest = digest(username).realm("Invalid").postProcessRequest(request);
assertThat(extractUser()).isNull();
}
@@ -117,11 +114,11 @@ public class SecurityMockMvcRequestPostProcessorsDigestTests {
filter.doFilter(request, new MockHttpServletResponse(), new MockFilterChain() {
@Override
public void doFilter(ServletRequest request, ServletResponse response) {
Authentication authentication = SecurityContextHolder.getContext()
.getAuthentication();
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
username = authentication == null ? null : authentication.getName();
}
});
return username;
}
}

View File

@@ -60,6 +60,7 @@ import static org.springframework.security.test.web.servlet.request.SecurityMock
*/
@RunWith(MockitoJUnitRunner.class)
public class SecurityMockMvcRequestPostProcessorsJwtTests {
@Captor
private ArgumentCaptor<SecurityContext> contextCaptor;
@@ -70,6 +71,7 @@ public class SecurityMockMvcRequestPostProcessorsJwtTests {
@Mock
private GrantedAuthority authority1;
@Mock
private GrantedAuthority authority2;
@@ -95,8 +97,7 @@ public class SecurityMockMvcRequestPostProcessorsJwtTests {
verify(this.repository).saveContext(this.contextCaptor.capture(), eq(this.request),
any(HttpServletResponse.class));
SecurityContext context = this.contextCaptor.getValue();
assertThat(context.getAuthentication()).isInstanceOf(
JwtAuthenticationToken.class);
assertThat(context.getAuthentication()).isInstanceOf(JwtAuthenticationToken.class);
JwtAuthenticationToken token = (JwtAuthenticationToken) context.getAuthentication();
assertThat(token.getAuthorities()).isNotEmpty();
assertThat(token.getToken()).isNotNull();
@@ -112,57 +113,48 @@ public class SecurityMockMvcRequestPostProcessorsJwtTests {
verify(this.repository).saveContext(this.contextCaptor.capture(), eq(this.request),
any(HttpServletResponse.class));
SecurityContext context = this.contextCaptor.getValue();
assertThat(context.getAuthentication()).isInstanceOf(
JwtAuthenticationToken.class);
assertThat(context.getAuthentication()).isInstanceOf(JwtAuthenticationToken.class);
JwtAuthenticationToken token = (JwtAuthenticationToken) context.getAuthentication();
assertThat(token.getToken().getSubject()).isSameAs(name);
}
@Test
public void jwtWhenProvidingCustomAuthoritiesThenProducesJwtAuthentication() {
jwt().jwt(jwt -> jwt.claim("scope", "ignored authorities"))
.authorities(this.authority1, this.authority2)
jwt().jwt(jwt -> jwt.claim("scope", "ignored authorities")).authorities(this.authority1, this.authority2)
.postProcessRequest(this.request);
verify(this.repository).saveContext(this.contextCaptor.capture(), eq(this.request),
any(HttpServletResponse.class));
SecurityContext context = this.contextCaptor.getValue();
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities())
.containsOnly(this.authority1, this.authority2);
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities()).containsOnly(this.authority1,
this.authority2);
}
@Test
public void jwtWhenProvidingScopedAuthoritiesThenProducesJwtAuthentication() {
jwt().jwt(jwt -> jwt.claim("scope", "scoped authorities"))
.postProcessRequest(this.request);
jwt().jwt(jwt -> jwt.claim("scope", "scoped authorities")).postProcessRequest(this.request);
verify(this.repository).saveContext(this.contextCaptor.capture(), eq(this.request),
any(HttpServletResponse.class));
SecurityContext context = this.contextCaptor.getValue();
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities())
.containsOnly(new SimpleGrantedAuthority("SCOPE_scoped"),
new SimpleGrantedAuthority("SCOPE_authorities"));
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities()).containsOnly(
new SimpleGrantedAuthority("SCOPE_scoped"), new SimpleGrantedAuthority("SCOPE_authorities"));
}
@Test
public void jwtWhenProvidingGrantedAuthoritiesThenProducesJwtAuthentication() {
jwt().jwt(jwt -> jwt.claim("scope", "ignored authorities"))
.authorities(jwt -> Arrays.asList(this.authority1))
jwt().jwt(jwt -> jwt.claim("scope", "ignored authorities")).authorities(jwt -> Arrays.asList(this.authority1))
.postProcessRequest(this.request);
verify(this.repository).saveContext(this.contextCaptor.capture(), eq(this.request),
any(HttpServletResponse.class));
SecurityContext context = this.contextCaptor.getValue();
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities())
.containsOnly(this.authority1);
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities()).containsOnly(this.authority1);
}
@Test
public void jwtWhenProvidingPreparedJwtThenUsesItForAuthentication() {
Jwt originalToken = TestJwts.jwt()
.header("header1", "value1")
.subject("some_user")
.build();
Jwt originalToken = TestJwts.jwt().header("header1", "value1").subject("some_user").build();
jwt().jwt(originalToken).postProcessRequest(this.request);
verify(this.repository).saveContext(this.contextCaptor.capture(), eq(this.request),
@@ -173,4 +165,5 @@ public class SecurityMockMvcRequestPostProcessorsJwtTests {
assertThat(retrievedToken.getToken().getTokenValue()).isEqualTo("token");
assertThat(retrievedToken.getToken().getHeaders().get("header1")).isEqualTo("value1");
}
}

View File

@@ -69,6 +69,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@ContextConfiguration
@WebAppConfiguration
public class SecurityMockMvcRequestPostProcessorsOAuth2ClientTests {
@Autowired
WebApplicationContext context;
@@ -89,19 +90,15 @@ public class SecurityMockMvcRequestPostProcessorsOAuth2ClientTests {
TestSecurityContextHolder.clearContext();
}
@Test
public void oauth2ClientWhenUsingDefaultsThenException()
throws Exception {
public void oauth2ClientWhenUsingDefaultsThenException() throws Exception {
assertThatCode(() -> oauth2Client().postProcessRequest(new MockHttpServletRequest()))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("ClientRegistration");
.isInstanceOf(IllegalArgumentException.class).hasMessageContaining("ClientRegistration");
}
@Test
public void oauth2ClientWhenUsingDefaultsThenProducesDefaultAuthorizedClient()
throws Exception {
public void oauth2ClientWhenUsingDefaultsThenProducesDefaultAuthorizedClient() throws Exception {
this.mvc.perform(get("/access-token").with(oauth2Client("registration-id")))
.andExpect(content().string("access-token"));
@@ -110,19 +107,16 @@ public class SecurityMockMvcRequestPostProcessorsOAuth2ClientTests {
}
@Test
public void oauth2ClientWhenClientRegistrationThenUses()
throws Exception {
public void oauth2ClientWhenClientRegistrationThenUses() throws Exception {
ClientRegistration clientRegistration = clientRegistration()
.registrationId("registration-id").clientId("client-id").build();
this.mvc.perform(get("/client-id")
.with(oauth2Client().clientRegistration(clientRegistration)))
ClientRegistration clientRegistration = clientRegistration().registrationId("registration-id")
.clientId("client-id").build();
this.mvc.perform(get("/client-id").with(oauth2Client().clientRegistration(clientRegistration)))
.andExpect(content().string("client-id"));
}
@Test
public void oauth2ClientWhenClientRegistrationConsumerThenUses()
throws Exception {
public void oauth2ClientWhenClientRegistrationConsumerThenUses() throws Exception {
this.mvc.perform(get("/client-id")
.with(oauth2Client("registration-id").clientRegistration(c -> c.clientId("client-id"))))
@@ -131,38 +125,35 @@ public class SecurityMockMvcRequestPostProcessorsOAuth2ClientTests {
@Test
public void oauth2ClientWhenPrincipalNameThenUses() throws Exception {
this.mvc.perform(get("/principal-name")
.with(oauth2Client("registration-id").principalName("test-subject")))
this.mvc.perform(get("/principal-name").with(oauth2Client("registration-id").principalName("test-subject")))
.andExpect(content().string("test-subject"));
}
@Test
public void oauth2ClientWhenAccessTokenThenUses() throws Exception {
OAuth2AccessToken accessToken = noScopes();
this.mvc.perform(get("/access-token")
.with(oauth2Client("registration-id").accessToken(accessToken)))
this.mvc.perform(get("/access-token").with(oauth2Client("registration-id").accessToken(accessToken)))
.andExpect(content().string("no-scopes"));
}
@Test
public void oauth2ClientWhenUsedOnceThenDoesNotAffectRemainingTests() throws Exception {
this.mvc.perform(get("/client-id")
.with(oauth2Client("registration-id")))
this.mvc.perform(get("/client-id").with(oauth2Client("registration-id")))
.andExpect(content().string("test-client"));
OAuth2AuthorizedClient client = new OAuth2AuthorizedClient(clientRegistration().build(), "sub", noScopes());
OAuth2AuthorizedClientRepository repository = this.context.getBean(OAuth2AuthorizedClientRepository.class);
when(repository.loadAuthorizedClient(eq("registration-id"), any(Authentication.class), any(HttpServletRequest.class)))
.thenReturn(client);
this.mvc.perform(get("/client-id"))
.andExpect(content().string("client-id"));
verify(repository).loadAuthorizedClient(
eq("registration-id"), any(Authentication.class), any(HttpServletRequest.class));
when(repository.loadAuthorizedClient(eq("registration-id"), any(Authentication.class),
any(HttpServletRequest.class))).thenReturn(client);
this.mvc.perform(get("/client-id")).andExpect(content().string("client-id"));
verify(repository).loadAuthorizedClient(eq("registration-id"), any(Authentication.class),
any(HttpServletRequest.class));
}
@EnableWebSecurity
@EnableWebMvc
static class OAuth2ClientConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
@@ -179,7 +170,6 @@ public class SecurityMockMvcRequestPostProcessorsOAuth2ClientTests {
return mock(ClientRegistrationRepository.class);
}
@Bean
OAuth2AuthorizedClientRepository authorizedClientRepository() {
return mock(OAuth2AuthorizedClientRepository.class);
@@ -187,20 +177,27 @@ public class SecurityMockMvcRequestPostProcessorsOAuth2ClientTests {
@RestController
static class PrincipalController {
@GetMapping("/access-token")
String accessToken(@RegisteredOAuth2AuthorizedClient("registration-id") OAuth2AuthorizedClient authorizedClient) {
String accessToken(
@RegisteredOAuth2AuthorizedClient("registration-id") OAuth2AuthorizedClient authorizedClient) {
return authorizedClient.getAccessToken().getTokenValue();
}
@GetMapping("/principal-name")
String principalName(@RegisteredOAuth2AuthorizedClient("registration-id") OAuth2AuthorizedClient authorizedClient) {
String principalName(
@RegisteredOAuth2AuthorizedClient("registration-id") OAuth2AuthorizedClient authorizedClient) {
return authorizedClient.getPrincipalName();
}
@GetMapping("/client-id")
String clientId(@RegisteredOAuth2AuthorizedClient("registration-id") OAuth2AuthorizedClient authorizedClient) {
String clientId(
@RegisteredOAuth2AuthorizedClient("registration-id") OAuth2AuthorizedClient authorizedClient) {
return authorizedClient.getClientRegistration().getClientId();
}
}
}
}

View File

@@ -69,6 +69,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@ContextConfiguration
@WebAppConfiguration
public class SecurityMockMvcRequestPostProcessorsOAuth2LoginTests {
@Autowired
WebApplicationContext context;
@@ -85,86 +86,69 @@ public class SecurityMockMvcRequestPostProcessorsOAuth2LoginTests {
}
@Test
public void oauth2LoginWhenUsingDefaultsThenProducesDefaultAuthentication()
throws Exception {
public void oauth2LoginWhenUsingDefaultsThenProducesDefaultAuthentication() throws Exception {
this.mvc.perform(get("/name").with(oauth2Login()))
.andExpect(content().string("user"));
this.mvc.perform(get("/admin/id-token/name").with(oauth2Login()))
.andExpect(status().isForbidden());
this.mvc.perform(get("/name").with(oauth2Login())).andExpect(content().string("user"));
this.mvc.perform(get("/admin/id-token/name").with(oauth2Login())).andExpect(status().isForbidden());
}
@Test
public void oauth2LoginWhenUsingDefaultsThenProducesDefaultAuthorizedClient()
throws Exception {
public void oauth2LoginWhenUsingDefaultsThenProducesDefaultAuthorizedClient() throws Exception {
this.mvc.perform(get("/client-id").with(oauth2Login()))
.andExpect(content().string("test-client"));
this.mvc.perform(get("/client-id").with(oauth2Login())).andExpect(content().string("test-client"));
}
@Test
public void oauth2LoginWhenAuthoritiesSpecifiedThenGrantsAccess() throws Exception {
this.mvc.perform(get("/admin/scopes")
.with(oauth2Login().authorities(new SimpleGrantedAuthority("SCOPE_admin"))))
this.mvc.perform(
get("/admin/scopes").with(oauth2Login().authorities(new SimpleGrantedAuthority("SCOPE_admin"))))
.andExpect(content().string("[\"SCOPE_admin\"]"));
}
@Test
public void oauth2LoginWhenAttributeSpecifiedThenUserHasAttribute() throws Exception {
this.mvc.perform(get("/attributes/iss")
.with(oauth2Login().attributes(a -> a.put("iss", "https://idp.example.org"))))
this.mvc.perform(
get("/attributes/iss").with(oauth2Login().attributes(a -> a.put("iss", "https://idp.example.org"))))
.andExpect(content().string("https://idp.example.org"));
}
@Test
public void oauth2LoginWhenNameSpecifiedThenUserHasName() throws Exception {
OAuth2User oauth2User = new DefaultOAuth2User(
AuthorityUtils.commaSeparatedStringToAuthorityList("SCOPE_read"),
Collections.singletonMap("custom-attribute", "test-subject"),
"custom-attribute");
this.mvc.perform(get("/attributes/custom-attribute")
.with(oauth2Login().oauth2User(oauth2User)))
OAuth2User oauth2User = new DefaultOAuth2User(AuthorityUtils.commaSeparatedStringToAuthorityList("SCOPE_read"),
Collections.singletonMap("custom-attribute", "test-subject"), "custom-attribute");
this.mvc.perform(get("/attributes/custom-attribute").with(oauth2Login().oauth2User(oauth2User)))
.andExpect(content().string("test-subject"));
this.mvc.perform(get("/name")
.with(oauth2Login().oauth2User(oauth2User)))
this.mvc.perform(get("/name").with(oauth2Login().oauth2User(oauth2User)))
.andExpect(content().string("test-subject"));
this.mvc.perform(get("/client-name")
.with(oauth2Login().oauth2User(oauth2User)))
this.mvc.perform(get("/client-name").with(oauth2Login().oauth2User(oauth2User)))
.andExpect(content().string("test-subject"));
}
@Test
public void oauth2LoginWhenClientRegistrationSpecifiedThenUses() throws Exception {
this.mvc.perform(get("/client-id")
.with(oauth2Login().clientRegistration(clientRegistration().build())))
this.mvc.perform(get("/client-id").with(oauth2Login().clientRegistration(clientRegistration().build())))
.andExpect(content().string("client-id"));
}
@Test
public void oauth2LoginWhenOAuth2UserSpecifiedThenLastCalledTakesPrecedence() throws Exception {
OAuth2User oauth2User = new DefaultOAuth2User(
AuthorityUtils.createAuthorityList("SCOPE_read"),
Collections.singletonMap("username", "user"),
"username");
OAuth2User oauth2User = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("SCOPE_read"),
Collections.singletonMap("username", "user"), "username");
this.mvc.perform(get("/attributes/sub")
.with(oauth2Login()
.attributes(a -> a.put("sub", "bar"))
.oauth2User(oauth2User)))
.andExpect(status().isOk())
.andExpect(content().string("no-attribute"));
this.mvc.perform(get("/attributes/sub")
.with(oauth2Login()
.oauth2User(oauth2User)
.attributes(a -> a.put("sub", "bar"))))
this.mvc.perform(
get("/attributes/sub").with(oauth2Login().attributes(a -> a.put("sub", "bar")).oauth2User(oauth2User)))
.andExpect(status().isOk()).andExpect(content().string("no-attribute"));
this.mvc.perform(
get("/attributes/sub").with(oauth2Login().oauth2User(oauth2User).attributes(a -> a.put("sub", "bar"))))
.andExpect(content().string("bar"));
}
@EnableWebSecurity
@EnableWebMvc
static class OAuth2LoginConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
@@ -188,6 +172,7 @@ public class SecurityMockMvcRequestPostProcessorsOAuth2LoginTests {
@RestController
static class PrincipalController {
@GetMapping("/name")
String name(@AuthenticationPrincipal OAuth2User oauth2User) {
return oauth2User.getName();
@@ -204,8 +189,8 @@ public class SecurityMockMvcRequestPostProcessorsOAuth2LoginTests {
}
@GetMapping("/attributes/{attribute}")
String attributes(
@AuthenticationPrincipal OAuth2User oauth2User, @PathVariable("attribute") String attribute) {
String attributes(@AuthenticationPrincipal OAuth2User oauth2User,
@PathVariable("attribute") String attribute) {
return Optional.ofNullable((String) oauth2User.getAttribute(attribute)).orElse("no-attribute");
}
@@ -214,9 +199,11 @@ public class SecurityMockMvcRequestPostProcessorsOAuth2LoginTests {
List<String> scopes(
@AuthenticationPrincipal(expression = "authorities") Collection<GrantedAuthority> authorities) {
return authorities.stream().map(GrantedAuthority::getAuthority)
.collect(Collectors.toList());
return authorities.stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());
}
}
}
}

View File

@@ -70,6 +70,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@ContextConfiguration
@WebAppConfiguration
public class SecurityMockMvcRequestPostProcessorsOidcLoginTests {
@Autowired
WebApplicationContext context;
@@ -91,86 +92,66 @@ public class SecurityMockMvcRequestPostProcessorsOidcLoginTests {
}
@Test
public void oidcLoginWhenUsingDefaultsThenProducesDefaultAuthentication()
throws Exception {
public void oidcLoginWhenUsingDefaultsThenProducesDefaultAuthentication() throws Exception {
this.mvc.perform(get("/name").with(oidcLogin()))
.andExpect(content().string("user"));
this.mvc.perform(get("/admin/id-token/name").with(oidcLogin()))
.andExpect(status().isForbidden());
this.mvc.perform(get("/name").with(oidcLogin())).andExpect(content().string("user"));
this.mvc.perform(get("/admin/id-token/name").with(oidcLogin())).andExpect(status().isForbidden());
}
@Test
public void oidcLoginWhenUsingDefaultsThenProducesDefaultAuthorizedClient()
throws Exception {
public void oidcLoginWhenUsingDefaultsThenProducesDefaultAuthorizedClient() throws Exception {
this.mvc.perform(get("/access-token").with(oidcLogin()))
.andExpect(content().string("access-token"));
this.mvc.perform(get("/access-token").with(oidcLogin())).andExpect(content().string("access-token"));
}
@Test
public void oidcLoginWhenAuthoritiesSpecifiedThenGrantsAccess() throws Exception {
this.mvc.perform(get("/admin/scopes")
.with(oidcLogin().authorities(new SimpleGrantedAuthority("SCOPE_admin"))))
this.mvc.perform(get("/admin/scopes").with(oidcLogin().authorities(new SimpleGrantedAuthority("SCOPE_admin"))))
.andExpect(content().string("[\"SCOPE_admin\"]"));
}
@Test
public void oidcLoginWhenIdTokenSpecifiedThenUserHasClaims() throws Exception {
this.mvc.perform(get("/id-token/iss")
.with(oidcLogin().idToken(i -> i.issuer("https://idp.example.org"))))
this.mvc.perform(get("/id-token/iss").with(oidcLogin().idToken(i -> i.issuer("https://idp.example.org"))))
.andExpect(content().string("https://idp.example.org"));
}
@Test
public void oidcLoginWhenUserInfoSpecifiedThenUserHasClaims() throws Exception {
this.mvc.perform(get("/user-info/email")
.with(oidcLogin().userInfoToken(u -> u.email("email@email"))))
this.mvc.perform(get("/user-info/email").with(oidcLogin().userInfoToken(u -> u.email("email@email"))))
.andExpect(content().string("email@email"));
}
@Test
public void oidcLoginWhenNameSpecifiedThenUserHasName() throws Exception {
OidcUser oidcUser = new DefaultOidcUser(
AuthorityUtils.commaSeparatedStringToAuthorityList("SCOPE_read"),
OidcUser oidcUser = new DefaultOidcUser(AuthorityUtils.commaSeparatedStringToAuthorityList("SCOPE_read"),
OidcIdToken.withTokenValue("id-token").claim("custom-attribute", "test-subject").build(),
"custom-attribute");
this.mvc.perform(get("/id-token/custom-attribute")
.with(oidcLogin().oidcUser(oidcUser)))
this.mvc.perform(get("/id-token/custom-attribute").with(oidcLogin().oidcUser(oidcUser)))
.andExpect(content().string("test-subject"));
this.mvc.perform(get("/name")
.with(oidcLogin().oidcUser(oidcUser)))
.andExpect(content().string("test-subject"));
this.mvc.perform(get("/name").with(oidcLogin().oidcUser(oidcUser))).andExpect(content().string("test-subject"));
this.mvc.perform(get("/client-name")
.with(oidcLogin().oidcUser(oidcUser)))
this.mvc.perform(get("/client-name").with(oidcLogin().oidcUser(oidcUser)))
.andExpect(content().string("test-subject"));
}
// gh-7794
@Test
public void oidcLoginWhenOidcUserSpecifiedThenLastCalledTakesPrecedence() throws Exception {
OidcUser oidcUser = new DefaultOidcUser(
AuthorityUtils.createAuthorityList("SCOPE_read"), idToken().build());
OidcUser oidcUser = new DefaultOidcUser(AuthorityUtils.createAuthorityList("SCOPE_read"), idToken().build());
this.mvc.perform(get("/id-token/sub")
.with(oidcLogin()
.idToken(i -> i.subject("foo"))
.oidcUser(oidcUser)))
.andExpect(status().isOk())
.andExpect(content().string("subject"));
this.mvc.perform(get("/id-token/sub")
.with(oidcLogin()
.oidcUser(oidcUser)
.idToken(i -> i.subject("bar"))))
this.mvc.perform(get("/id-token/sub").with(oidcLogin().idToken(i -> i.subject("foo")).oidcUser(oidcUser)))
.andExpect(status().isOk()).andExpect(content().string("subject"));
this.mvc.perform(get("/id-token/sub").with(oidcLogin().oidcUser(oidcUser).idToken(i -> i.subject("bar"))))
.andExpect(content().string("bar"));
}
@EnableWebSecurity
@EnableWebMvc
static class OAuth2LoginConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
@@ -188,7 +169,6 @@ public class SecurityMockMvcRequestPostProcessorsOidcLoginTests {
return mock(ClientRegistrationRepository.class);
}
@Bean
OAuth2AuthorizedClientRepository oAuth2AuthorizedClientRepository() {
return mock(OAuth2AuthorizedClientRepository.class);
@@ -196,6 +176,7 @@ public class SecurityMockMvcRequestPostProcessorsOidcLoginTests {
@RestController
static class PrincipalController {
@GetMapping("/name")
String name(@AuthenticationPrincipal OidcUser oidcUser) {
return oidcUser.getName();
@@ -222,11 +203,13 @@ public class SecurityMockMvcRequestPostProcessorsOidcLoginTests {
}
@GetMapping("/admin/scopes")
List<String> scopes(@AuthenticationPrincipal(expression = "authorities")
Collection<GrantedAuthority> authorities) {
return authorities.stream().map(GrantedAuthority::getAuthority)
.collect(Collectors.toList());
List<String> scopes(
@AuthenticationPrincipal(expression = "authorities") Collection<GrantedAuthority> authorities) {
return authorities.stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());
}
}
}
}

View File

@@ -64,6 +64,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@ContextConfiguration
@WebAppConfiguration
public class SecurityMockMvcRequestPostProcessorsOpaqueTokenTests {
@Autowired
WebApplicationContext context;
@@ -80,19 +81,16 @@ public class SecurityMockMvcRequestPostProcessorsOpaqueTokenTests {
}
@Test
public void opaqueTokenWhenUsingDefaultsThenProducesDefaultAuthentication()
throws Exception {
public void opaqueTokenWhenUsingDefaultsThenProducesDefaultAuthentication() throws Exception {
this.mvc.perform(get("/name").with(opaqueToken()))
.andExpect(content().string("user"));
this.mvc.perform(get("/admin/scopes").with(opaqueToken()))
.andExpect(status().isForbidden());
this.mvc.perform(get("/name").with(opaqueToken())).andExpect(content().string("user"));
this.mvc.perform(get("/admin/scopes").with(opaqueToken())).andExpect(status().isForbidden());
}
@Test
public void opaqueTokenWhenAttributeSpecifiedThenUserHasAttribute() throws Exception {
this.mvc.perform(get("/opaque-token/iss")
.with(opaqueToken().attributes(a -> a.put("iss", "https://idp.example.org"))))
this.mvc.perform(
get("/opaque-token/iss").with(opaqueToken().attributes(a -> a.put("iss", "https://idp.example.org"))))
.andExpect(content().string("https://idp.example.org"));
}
@@ -103,8 +101,7 @@ public class SecurityMockMvcRequestPostProcessorsOpaqueTokenTests {
when(principal.getName()).thenReturn("ben");
when(principal.getAuthorities()).thenReturn(authorities);
this.mvc.perform(get("/name").with(opaqueToken().principal(principal)))
.andExpect(content().string("ben"));
this.mvc.perform(get("/name").with(opaqueToken().principal(principal))).andExpect(content().string("ben"));
}
// gh-7800
@@ -112,22 +109,18 @@ public class SecurityMockMvcRequestPostProcessorsOpaqueTokenTests {
public void opaqueTokenWhenPrincipalSpecifiedThenLastCalledTakesPrecedence() throws Exception {
OAuth2AuthenticatedPrincipal principal = active(a -> a.put("scope", "user"));
this.mvc.perform(get("/opaque-token/sub")
.with(opaqueToken()
.attributes(a -> a.put("sub", "foo"))
.principal(principal)))
.andExpect(status().isOk())
.andExpect(content().string((String) principal.getAttribute("sub")));
this.mvc.perform(get("/opaque-token/sub")
.with(opaqueToken()
.principal(principal)
.attributes(a -> a.put("sub", "bar"))))
this.mvc.perform(
get("/opaque-token/sub").with(opaqueToken().attributes(a -> a.put("sub", "foo")).principal(principal)))
.andExpect(status().isOk()).andExpect(content().string((String) principal.getAttribute("sub")));
this.mvc.perform(
get("/opaque-token/sub").with(opaqueToken().principal(principal).attributes(a -> a.put("sub", "bar"))))
.andExpect(content().string("bar"));
}
@EnableWebSecurity
@EnableWebMvc
static class OAuth2LoginConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
@@ -144,6 +137,7 @@ public class SecurityMockMvcRequestPostProcessorsOpaqueTokenTests {
@RestController
static class PrincipalController {
@GetMapping("/name")
String name(@AuthenticationPrincipal OAuth2AuthenticatedPrincipal principal) {
return principal.getName();
@@ -157,12 +151,14 @@ public class SecurityMockMvcRequestPostProcessorsOpaqueTokenTests {
}
@GetMapping("/admin/scopes")
List<String> scopes(@AuthenticationPrincipal(expression = "authorities")
Collection<GrantedAuthority> authorities) {
List<String> scopes(
@AuthenticationPrincipal(expression = "authorities") Collection<GrantedAuthority> authorities) {
return authorities.stream().map(GrantedAuthority::getAuthority)
.collect(Collectors.toList());
return authorities.stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());
}
}
}
}

View File

@@ -43,10 +43,13 @@ import org.springframework.security.web.context.SecurityContextRepository;
@RunWith(PowerMockRunner.class)
@PrepareOnlyThisForTest(WebTestUtils.class)
@PowerMockIgnore({"javax.security.auth.*", "org.w3c.dom.*", "org.xml.sax.*", "org.apache.xerces.*", "javax.xml.parsers.*"})
@PowerMockIgnore({ "javax.security.auth.*", "org.w3c.dom.*", "org.xml.sax.*", "org.apache.xerces.*",
"javax.xml.parsers.*" })
public class SecurityMockMvcRequestPostProcessorsSecurityContextTests {
@Captor
private ArgumentCaptor<SecurityContext> contextCaptor;
@Mock
private SecurityContextRepository repository;
@@ -70,8 +73,7 @@ public class SecurityMockMvcRequestPostProcessorsSecurityContextTests {
public void userDetails() {
securityContext(expectedContext).postProcessRequest(request);
verify(repository).saveContext(contextCaptor.capture(), eq(request),
any(HttpServletResponse.class));
verify(repository).saveContext(contextCaptor.capture(), eq(request), any(HttpServletResponse.class));
SecurityContext context = contextCaptor.getValue();
assertThat(context).isSameAs(this.expectedContext);
}
@@ -80,4 +82,5 @@ public class SecurityMockMvcRequestPostProcessorsSecurityContextTests {
spy(WebTestUtils.class);
when(WebTestUtils.getSecurityContextRepository(request)).thenReturn(repository);
}
}

View File

@@ -57,8 +57,7 @@ public class SecurityMockMvcRequestPostProcessorsTestSecurityContextStatelessTes
@Before
public void setup() {
mvc = MockMvcBuilders.webAppContextSetup(context)
.addFilters(springSecurityFilterChain)
mvc = MockMvcBuilders.webAppContextSetup(context).addFilters(springSecurityFilterChain)
.defaultRequest(get("/").with(testSecurityContext())).build();
}
@@ -92,10 +91,14 @@ public class SecurityMockMvcRequestPostProcessorsTestSecurityContextStatelessTes
@RestController
static class Controller {
@RequestMapping
public String hello() {
return "Hello";
}
}
}
}

View File

@@ -40,10 +40,13 @@ import org.springframework.security.web.context.SecurityContextRepository;
@RunWith(PowerMockRunner.class)
@PrepareOnlyThisForTest(WebTestUtils.class)
@PowerMockIgnore({"javax.security.auth.*", "org.w3c.dom.*", "org.xml.sax.*", "org.apache.xerces.*", "javax.xml.parsers.*"})
@PowerMockIgnore({ "javax.security.auth.*", "org.w3c.dom.*", "org.xml.sax.*", "org.apache.xerces.*",
"javax.xml.parsers.*" })
public class SecurityMockMvcRequestPostProcessorsTestSecurityContextTests {
@Mock
private SecurityContext context;
@Mock
private SecurityContextRepository repository;
@@ -66,8 +69,7 @@ public class SecurityMockMvcRequestPostProcessorsTestSecurityContextTests {
testSecurityContext().postProcessRequest(request);
verify(repository).saveContext(eq(context), eq(request),
any(HttpServletResponse.class));
verify(repository).saveContext(eq(context), eq(request), any(HttpServletResponse.class));
}
// Ensure it does not fail if TestSecurityContextHolder is not initialized
@@ -83,4 +85,5 @@ public class SecurityMockMvcRequestPostProcessorsTestSecurityContextTests {
spy(WebTestUtils.class);
when(WebTestUtils.getSecurityContextRepository(request)).thenReturn(repository);
}
}

View File

@@ -45,10 +45,13 @@ import org.springframework.security.web.context.SecurityContextRepository;
@RunWith(PowerMockRunner.class)
@PrepareOnlyThisForTest(WebTestUtils.class)
@PowerMockIgnore({"javax.security.auth.*", "org.w3c.dom.*", "org.xml.sax.*", "org.apache.xerces.*", "javax.xml.parsers.*"})
@PowerMockIgnore({ "javax.security.auth.*", "org.w3c.dom.*", "org.xml.sax.*", "org.apache.xerces.*",
"javax.xml.parsers.*" })
public class SecurityMockMvcRequestPostProcessorsUserDetailsTests {
@Captor
private ArgumentCaptor<SecurityContext> contextCaptor;
@Mock
private SecurityContextRepository repository;
@@ -72,11 +75,9 @@ public class SecurityMockMvcRequestPostProcessorsUserDetailsTests {
public void userDetails() {
user(userDetails).postProcessRequest(request);
verify(repository).saveContext(contextCaptor.capture(), eq(request),
any(HttpServletResponse.class));
verify(repository).saveContext(contextCaptor.capture(), eq(request), any(HttpServletResponse.class));
SecurityContext context = contextCaptor.getValue();
assertThat(context.getAuthentication()).isInstanceOf(
UsernamePasswordAuthenticationToken.class);
assertThat(context.getAuthentication()).isInstanceOf(UsernamePasswordAuthenticationToken.class);
assertThat(context.getAuthentication().getPrincipal()).isSameAs(userDetails);
}
@@ -84,4 +85,5 @@ public class SecurityMockMvcRequestPostProcessorsUserDetailsTests {
spy(WebTestUtils.class);
when(WebTestUtils.getSecurityContextRepository(request)).thenReturn(repository);
}
}

View File

@@ -48,10 +48,13 @@ import org.springframework.security.web.context.SecurityContextRepository;
@RunWith(PowerMockRunner.class)
@PrepareOnlyThisForTest(WebTestUtils.class)
@PowerMockIgnore({"javax.security.auth.*", "org.w3c.dom.*", "org.xml.sax.*", "org.apache.xerces.*", "javax.xml.parsers.*"})
@PowerMockIgnore({ "javax.security.auth.*", "org.w3c.dom.*", "org.xml.sax.*", "org.apache.xerces.*",
"javax.xml.parsers.*" })
public class SecurityMockMvcRequestPostProcessorsUserTests {
@Captor
private ArgumentCaptor<SecurityContext> contextCaptor;
@Mock
private SecurityContextRepository repository;
@@ -59,6 +62,7 @@ public class SecurityMockMvcRequestPostProcessorsUserTests {
@Mock
private GrantedAuthority authority1;
@Mock
private GrantedAuthority authority2;
@@ -79,33 +83,27 @@ public class SecurityMockMvcRequestPostProcessorsUserTests {
user(username).postProcessRequest(request);
verify(repository).saveContext(contextCaptor.capture(), eq(request),
any(HttpServletResponse.class));
verify(repository).saveContext(contextCaptor.capture(), eq(request), any(HttpServletResponse.class));
SecurityContext context = contextCaptor.getValue();
assertThat(context.getAuthentication()).isInstanceOf(
UsernamePasswordAuthenticationToken.class);
assertThat(context.getAuthentication()).isInstanceOf(UsernamePasswordAuthenticationToken.class);
assertThat(context.getAuthentication().getName()).isEqualTo(username);
assertThat(context.getAuthentication().getCredentials()).isEqualTo("password");
assertThat(context.getAuthentication().getAuthorities()).extracting("authority")
.containsOnly("ROLE_USER");
assertThat(context.getAuthentication().getAuthorities()).extracting("authority").containsOnly("ROLE_USER");
}
@Test
public void userWithCustom() {
String username = "customuser";
user(username).roles("CUSTOM", "ADMIN").password("newpass")
.postProcessRequest(request);
user(username).roles("CUSTOM", "ADMIN").password("newpass").postProcessRequest(request);
verify(repository).saveContext(contextCaptor.capture(), eq(request),
any(HttpServletResponse.class));
verify(repository).saveContext(contextCaptor.capture(), eq(request), any(HttpServletResponse.class));
SecurityContext context = contextCaptor.getValue();
assertThat(context.getAuthentication()).isInstanceOf(
UsernamePasswordAuthenticationToken.class);
assertThat(context.getAuthentication()).isInstanceOf(UsernamePasswordAuthenticationToken.class);
assertThat(context.getAuthentication().getName()).isEqualTo(username);
assertThat(context.getAuthentication().getCredentials()).isEqualTo("newpass");
assertThat(context.getAuthentication().getAuthorities()).extracting("authority")
.containsOnly("ROLE_CUSTOM", "ROLE_ADMIN");
assertThat(context.getAuthentication().getAuthorities()).extracting("authority").containsOnly("ROLE_CUSTOM",
"ROLE_ADMIN");
}
@Test
@@ -114,11 +112,10 @@ public class SecurityMockMvcRequestPostProcessorsUserTests {
user(username).authorities(authority1, authority2).postProcessRequest(request);
verify(repository).saveContext(contextCaptor.capture(), eq(request),
any(HttpServletResponse.class));
verify(repository).saveContext(contextCaptor.capture(), eq(request), any(HttpServletResponse.class));
SecurityContext context = contextCaptor.getValue();
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities())
.containsOnly(authority1, authority2);
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities()).containsOnly(authority1,
authority2);
}
@Test(expected = IllegalArgumentException.class)
@@ -130,18 +127,17 @@ public class SecurityMockMvcRequestPostProcessorsUserTests {
public void userCustomAuthoritiesList() {
String username = "customuser";
user(username).authorities(Arrays.asList(authority1, authority2))
.postProcessRequest(request);
user(username).authorities(Arrays.asList(authority1, authority2)).postProcessRequest(request);
verify(repository).saveContext(contextCaptor.capture(), eq(request),
any(HttpServletResponse.class));
verify(repository).saveContext(contextCaptor.capture(), eq(request), any(HttpServletResponse.class));
SecurityContext context = contextCaptor.getValue();
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities())
.containsOnly(authority1, authority2);
assertThat((List<GrantedAuthority>) context.getAuthentication().getAuthorities()).containsOnly(authority1,
authority2);
}
private void mockWebTestUtils() {
spy(WebTestUtils.class);
when(WebTestUtils.getSecurityContextRepository(request)).thenReturn(repository);
}
}

View File

@@ -106,5 +106,7 @@ public class Gh3409Tests {
// @formatter:on
}
}
}

View File

@@ -47,6 +47,7 @@ import static org.springframework.security.test.web.servlet.setup.SecurityMockMv
@ContextConfiguration(classes = SecurityMockMvcResultMatchersTests.Config.class)
@WebAppConfiguration
public class SecurityMockMvcResultMatchersTests {
@Autowired
private WebApplicationContext context;
@@ -64,16 +65,14 @@ public class SecurityMockMvcResultMatchersTests {
@Test
public void withAuthenticationWhenMatchesThenSuccess() throws Exception {
this.mockMvc.perform(formLogin())
.andExpect(authenticated().withAuthentication(auth ->
assertThat(auth).isInstanceOf(UsernamePasswordAuthenticationToken.class)));
this.mockMvc.perform(formLogin()).andExpect(authenticated()
.withAuthentication(auth -> assertThat(auth).isInstanceOf(UsernamePasswordAuthenticationToken.class)));
}
@Test(expected = AssertionError.class)
public void withAuthenticationWhenNotMatchesThenFails() throws Exception {
this.mockMvc
.perform(formLogin())
.andExpect(authenticated().withAuthentication(auth -> assertThat(auth.getName()).isEqualTo("notmatch")));
this.mockMvc.perform(formLogin()).andExpect(
authenticated().withAuthentication(auth -> assertThat(auth.getName()).isEqualTo("notmatch")));
}
// SEC-2719
@@ -110,10 +109,14 @@ public class SecurityMockMvcResultMatchersTests {
@RestController
static class Controller {
@RequestMapping("/")
public String ok() {
return "ok";
}
}
}
}

View File

@@ -49,6 +49,7 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@ContextConfiguration(classes = SecurityMockWithAuthoritiesMvcResultMatchersTests.Config.class)
@WebAppConfiguration
public class SecurityMockWithAuthoritiesMvcResultMatchersTests {
@Autowired
private WebApplicationContext context;
@@ -56,8 +57,7 @@ public class SecurityMockWithAuthoritiesMvcResultMatchersTests {
@Before
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity())
.build();
mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build();
}
@Test
@@ -65,8 +65,7 @@ public class SecurityMockWithAuthoritiesMvcResultMatchersTests {
List<SimpleGrantedAuthority> grantedAuthorities = new ArrayList<>();
grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_SELLER"));
mockMvc.perform(formLogin())
.andExpect(authenticated().withAuthorities(grantedAuthorities));
mockMvc.perform(formLogin()).andExpect(authenticated().withAuthorities(grantedAuthorities));
}
@Test(expected = AssertionError.class)
@@ -90,10 +89,14 @@ public class SecurityMockWithAuthoritiesMvcResultMatchersTests {
@RestController
static class Controller {
@RequestMapping("/")
public String ok() {
return "ok";
}
}
}
}

View File

@@ -36,14 +36,19 @@ import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class SecurityMockMvcConfigurerTests {
@Mock
private Filter filter;
@Mock
private Filter beanFilter;
@Mock
private ConfigurableMockMvcBuilder<?> builder;
@Mock
private WebApplicationContext context;
@Mock
private ServletContext servletContext;
@@ -61,8 +66,7 @@ public class SecurityMockMvcConfigurerTests {
configurer.beforeMockMvcCreated(this.builder, this.context);
assertFilterAdded(this.filter);
verify(this.servletContext).setAttribute(BeanIds.SPRING_SECURITY_FILTER_CHAIN,
this.filter);
verify(this.servletContext).setAttribute(BeanIds.SPRING_SECURITY_FILTER_CHAIN, this.filter);
}
@Test
@@ -95,15 +99,15 @@ public class SecurityMockMvcConfigurerTests {
}
private void assertFilterAdded(Filter filter) {
ArgumentCaptor<SecurityMockMvcConfigurer.DelegateFilter> filterArg = ArgumentCaptor.forClass(
SecurityMockMvcConfigurer.DelegateFilter.class);
ArgumentCaptor<SecurityMockMvcConfigurer.DelegateFilter> filterArg = ArgumentCaptor
.forClass(SecurityMockMvcConfigurer.DelegateFilter.class);
verify(this.builder).addFilters(filterArg.capture());
assertThat(filterArg.getValue().getDelegate()).isEqualTo(filter);
}
private void returnFilterBean() {
when(this.context.containsBean(anyString())).thenReturn(true);
when(this.context.getBean(anyString(), eq(Filter.class)))
.thenReturn(this.beanFilter);
when(this.context.getBean(anyString(), eq(Filter.class))).thenReturn(this.beanFilter);
}
}

View File

@@ -42,46 +42,45 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@RunWith(SpringRunner.class)
@WebAppConfiguration
public class SecurityMockMvcConfigurersTests {
@Autowired
WebApplicationContext wac;
Filter noOpFilter = mock(Filter.class);
/**
* Since noOpFilter is first does not continue the chain, security will not be invoked and the status should be OK
*
* Since noOpFilter is first does not continue the chain, security will not be invoked
* and the status should be OK
* @throws Exception
*/
@Test
public void applySpringSecurityWhenAddFilterFirstThenFilterFirst() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
.addFilters(this.noOpFilter)
.apply(springSecurity())
.build();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).addFilters(this.noOpFilter)
.apply(springSecurity()).build();
mockMvc.perform(get("/"))
.andExpect(status().isOk());
mockMvc.perform(get("/")).andExpect(status().isOk());
}
/**
* Since noOpFilter is second security will be invoked and the status will be not OK. We know this because if noOpFilter
* were first security would not be invoked sincet noOpFilter does not continue the FilterChain
* Since noOpFilter is second security will be invoked and the status will be not OK.
* We know this because if noOpFilter were first security would not be invoked sincet
* noOpFilter does not continue the FilterChain
* @throws Exception
*/
@Test
public void applySpringSecurityWhenAddFilterSecondThenSecurityFirst() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
.apply(springSecurity())
.addFilters(this.noOpFilter)
.build();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).apply(springSecurity())
.addFilters(this.noOpFilter).build();
mockMvc.perform(get("/"))
.andExpect(status().is4xxClientError());
mockMvc.perform(get("/")).andExpect(status().is4xxClientError());
}
@Configuration
@EnableWebMvc
@EnableWebSecurity
@Import(AuthenticationTestConfiguration.class)
static class Config {}
static class Config {
}
}

View File

@@ -83,5 +83,7 @@ public class CsrfShowcaseTests {
.withUser("user").password("password").roles("USER");
// @formatter:on
}
}
}

View File

@@ -56,8 +56,8 @@ public class CustomCsrfShowcaseTests {
@Before
public void setup() {
mvc = MockMvcBuilders.webAppContextSetup(context)
.defaultRequest(get("/").with(csrf())).apply(springSecurity()).build();
mvc = MockMvcBuilders.webAppContextSetup(context).defaultRequest(get("/").with(csrf())).apply(springSecurity())
.build();
}
@Test
@@ -98,5 +98,7 @@ public class CustomCsrfShowcaseTests {
repo.setParameterName("custom_csrf");
return repo;
}
}
}

View File

@@ -48,8 +48,8 @@ public class DefaultCsrfShowcaseTests {
@Before
public void setup() {
mvc = MockMvcBuilders.webAppContextSetup(context)
.defaultRequest(get("/").with(csrf())).apply(springSecurity()).build();
mvc = MockMvcBuilders.webAppContextSetup(context).defaultRequest(get("/").with(csrf())).apply(springSecurity())
.build();
}
@Test
@@ -78,5 +78,7 @@ public class DefaultCsrfShowcaseTests {
.withUser("user").password("password").roles("USER");
// @formatter:on
}
}
}

View File

@@ -54,10 +54,8 @@ public class AuthenticationTests {
@Before
public void setup() {
mvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity())
.defaultRequest(get("/").accept(MediaType.TEXT_HTML))
.build();
mvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity())
.defaultRequest(get("/").accept(MediaType.TEXT_HTML)).build();
}
@Test
@@ -67,29 +65,26 @@ public class AuthenticationTests {
@Test
public void httpBasicAuthenticationSuccess() throws Exception {
mvc.perform(get("/secured/butnotfound").with(httpBasic("user", "password")))
.andExpect(status().isNotFound())
mvc.perform(get("/secured/butnotfound").with(httpBasic("user", "password"))).andExpect(status().isNotFound())
.andExpect(authenticated().withUsername("user"));
}
@Test
public void authenticationSuccess() throws Exception {
mvc.perform(formLogin()).andExpect(status().isFound())
.andExpect(redirectedUrl("/"))
mvc.perform(formLogin()).andExpect(status().isFound()).andExpect(redirectedUrl("/"))
.andExpect(authenticated().withUsername("user"));
}
@Test
public void authenticationFailed() throws Exception {
mvc.perform(formLogin().user("user").password("invalid"))
.andExpect(status().isFound())
.andExpect(redirectedUrl("/login?error"))
.andExpect(unauthenticated());
mvc.perform(formLogin().user("user").password("invalid")).andExpect(status().isFound())
.andExpect(redirectedUrl("/login?error")).andExpect(unauthenticated());
}
@EnableWebSecurity
@EnableWebMvc
static class Config extends WebSecurityConfigurerAdapter {
@Bean
public UserDetailsService userDetailsService() {
// @formatter:off
@@ -97,5 +92,7 @@ public class AuthenticationTests {
return new InMemoryUserDetailsManager(user);
// @formatter:on
}
}
}

View File

@@ -64,26 +64,21 @@ public class CustomConfigAuthenticationTests {
@Test
public void authenticationSuccess() throws Exception {
mvc.perform(
formLogin("/authenticate").user("user", "user").password("pass",
"password")).andExpect(status().isFound())
.andExpect(redirectedUrl("/"))
mvc.perform(formLogin("/authenticate").user("user", "user").password("pass", "password"))
.andExpect(status().isFound()).andExpect(redirectedUrl("/"))
.andExpect(authenticated().withUsername("user"));
}
@Test
public void withUserSuccess() throws Exception {
mvc.perform(get("/").with(user("user")))
.andExpect(status().isNotFound())
mvc.perform(get("/").with(user("user"))).andExpect(status().isNotFound())
.andExpect(authenticated().withUsername("user"));
}
@Test
public void authenticationFailed() throws Exception {
mvc.perform(
formLogin("/authenticate").user("user", "notfound").password("pass",
"invalid")).andExpect(status().isFound())
.andExpect(redirectedUrl("/authenticate?error"))
mvc.perform(formLogin("/authenticate").user("user", "notfound").password("pass", "invalid"))
.andExpect(status().isFound()).andExpect(redirectedUrl("/authenticate?error"))
.andExpect(unauthenticated());
}
@@ -122,5 +117,7 @@ public class CustomConfigAuthenticationTests {
repo.setSpringSecurityContextKey("CUSTOM");
return repo;
}
}
}

View File

@@ -58,23 +58,18 @@ public class CustomLoginRequestBuilderAuthenticationTests {
@Test
public void authenticationSuccess() throws Exception {
mvc.perform(login())
.andExpect(status().isFound())
.andExpect(redirectedUrl("/"))
mvc.perform(login()).andExpect(status().isFound()).andExpect(redirectedUrl("/"))
.andExpect(authenticated().withUsername("user"));
}
@Test
public void authenticationFailed() throws Exception {
mvc.perform(login().user("notfound").password("invalid"))
.andExpect(status().isFound())
.andExpect(redirectedUrl("/authenticate?error"))
.andExpect(unauthenticated());
mvc.perform(login().user("notfound").password("invalid")).andExpect(status().isFound())
.andExpect(redirectedUrl("/authenticate?error")).andExpect(unauthenticated());
}
static FormLoginRequestBuilder login() {
return SecurityMockMvcRequestBuilders.formLogin("/authenticate")
.userParameter("user").passwordParam("pass");
return SecurityMockMvcRequestBuilders.formLogin("/authenticate").userParameter("user").passwordParam("pass");
}
@EnableWebSecurity
@@ -102,5 +97,7 @@ public class CustomLoginRequestBuilderAuthenticationTests {
return new InMemoryUserDetailsManager(user);
}
// @formatter:on
}
}

View File

@@ -49,15 +49,14 @@ public class DefaultfSecurityRequestsTests {
@Before
public void setup() {
mvc = MockMvcBuilders.webAppContextSetup(context)
.defaultRequest(get("/").with(user("user").roles("ADMIN")))
mvc = MockMvcBuilders.webAppContextSetup(context).defaultRequest(get("/").with(user("user").roles("ADMIN")))
.apply(springSecurity()).build();
}
@Test
public void requestProtectedUrlWithUser() throws Exception {
mvc.perform(get("/"))
// Ensure we got past Security
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with user
.andExpect(authenticated().withUsername("user"));
@@ -66,7 +65,7 @@ public class DefaultfSecurityRequestsTests {
@Test
public void requestProtectedUrlWithAdmin() throws Exception {
mvc.perform(get("/admin"))
// Ensure we got past Security
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with user
.andExpect(authenticated().withUsername("user"));
@@ -105,5 +104,7 @@ public class DefaultfSecurityRequestsTests {
.withUser("user").password("password").roles("USER");
// @formatter:on
}
}
}

View File

@@ -63,7 +63,7 @@ public class SecurityRequestsTests {
@Test
public void requestProtectedUrlWithUser() throws Exception {
mvc.perform(get("/").with(user("user")))
// Ensure we got past Security
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with user
.andExpect(authenticated().withUsername("user"));
@@ -72,7 +72,7 @@ public class SecurityRequestsTests {
@Test
public void requestProtectedUrlWithAdmin() throws Exception {
mvc.perform(get("/admin").with(user("admin").roles("ADMIN")))
// Ensure we got past Security
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with admin
.andExpect(authenticated().withUsername("admin"));
@@ -82,7 +82,7 @@ public class SecurityRequestsTests {
public void requestProtectedUrlWithUserDetails() throws Exception {
UserDetails user = userDetailsService.loadUserByUsername("user");
mvc.perform(get("/").with(user(user)))
// Ensure we got past Security
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with user
.andExpect(authenticated().withAuthenticationPrincipal(user));
@@ -90,10 +90,9 @@ public class SecurityRequestsTests {
@Test
public void requestProtectedUrlWithAuthentication() throws Exception {
Authentication authentication = new TestingAuthenticationToken("test", "notused",
"ROLE_USER");
Authentication authentication = new TestingAuthenticationToken("test", "notused", "ROLE_USER");
mvc.perform(get("/").with(authentication(authentication)))
// Ensure we got past Security
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with user
.andExpect(authenticated().withAuthentication(authentication));
@@ -129,5 +128,7 @@ public class SecurityRequestsTests {
public UserDetailsService userDetailsServiceBean() throws Exception {
return super.userDetailsServiceBean();
}
}
}

View File

@@ -28,6 +28,7 @@ import org.springframework.security.test.context.support.WithMockUser;
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@WithMockUser(value="rob", roles="ADMIN")
@WithMockUser(value = "rob", roles = "ADMIN")
public @interface WithAdminRob {
}

View File

@@ -49,15 +49,14 @@ public class WithUserAuthenticationTests {
@Before
public void setup() {
mvc = MockMvcBuilders.webAppContextSetup(context)
.apply(SecurityMockMvcConfigurers.springSecurity()).build();
mvc = MockMvcBuilders.webAppContextSetup(context).apply(SecurityMockMvcConfigurers.springSecurity()).build();
}
@Test
@WithMockUser
public void requestProtectedUrlWithUser() throws Exception {
mvc.perform(get("/"))
// Ensure we got past Security
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with user
.andExpect(authenticated().withUsername("user"));
@@ -67,7 +66,7 @@ public class WithUserAuthenticationTests {
@WithAdminRob
public void requestProtectedUrlWithAdminRob() throws Exception {
mvc.perform(get("/"))
// Ensure we got past Security
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with user
.andExpect(authenticated().withUsername("rob").withRoles("ADMIN"));
@@ -77,7 +76,7 @@ public class WithUserAuthenticationTests {
@WithMockUser(roles = "ADMIN")
public void requestProtectedUrlWithAdmin() throws Exception {
mvc.perform(get("/admin"))
// Ensure we got past Security
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with user
.andExpect(authenticated().withUsername("user").withRoles("ADMIN"));
@@ -107,5 +106,7 @@ public class WithUserAuthenticationTests {
.withUser("user").password("password").roles("USER");
// @formatter:on
}
}
}

View File

@@ -58,7 +58,7 @@ public class WithUserClassLevelAuthenticationTests {
@Test
public void requestProtectedUrlWithUser() throws Exception {
mvc.perform(get("/"))
// Ensure we got past Security
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with user
.andExpect(authenticated().withUsername("user"));
@@ -67,7 +67,7 @@ public class WithUserClassLevelAuthenticationTests {
@Test
public void requestProtectedUrlWithAdmin() throws Exception {
mvc.perform(get("/admin"))
// Ensure we got past Security
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with user
.andExpect(authenticated().withUsername("user").withRoles("ADMIN"));
@@ -107,5 +107,7 @@ public class WithUserClassLevelAuthenticationTests {
.withUser("user").password("password").roles("USER");
// @formatter:on
}
}
}

View File

@@ -58,7 +58,7 @@ public class WithUserDetailsAuthenticationTests {
@WithUserDetails
public void requestProtectedUrlWithUser() throws Exception {
mvc.perform(get("/"))
// Ensure we got past Security
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with user
.andExpect(authenticated().withUsername("user"));
@@ -71,8 +71,7 @@ public class WithUserDetailsAuthenticationTests {
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with user
.andExpect(
authenticated().withUsername("admin").withRoles("ADMIN", "USER"));
.andExpect(authenticated().withUsername("admin").withRoles("ADMIN", "USER"));
}
@EnableWebSecurity
@@ -106,5 +105,7 @@ public class WithUserDetailsAuthenticationTests {
.withUser("admin").password("password").roles("USER", "ADMIN");
// @formatter:on
}
}
}

View File

@@ -61,8 +61,7 @@ public class WithUserDetailsClassLevelAuthenticationTests {
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with user
.andExpect(
authenticated().withUsername("admin").withRoles("ADMIN", "USER"));
.andExpect(authenticated().withUsername("admin").withRoles("ADMIN", "USER"));
}
@Test
@@ -71,8 +70,7 @@ public class WithUserDetailsClassLevelAuthenticationTests {
// Ensure we got past Security
.andExpect(status().isNotFound())
// Ensure it appears we are authenticated with user
.andExpect(
authenticated().withUsername("admin").withRoles("ADMIN", "USER"));
.andExpect(authenticated().withUsername("admin").withRoles("ADMIN", "USER"));
}
@EnableWebSecurity
@@ -106,5 +104,7 @@ public class WithUserDetailsClassLevelAuthenticationTests {
.withUser("admin").password("password").roles("USER", "ADMIN");
// @formatter:on
}
}
}

View File

@@ -47,12 +47,15 @@ import static org.springframework.security.test.web.support.WebTestUtils.getSecu
@RunWith(MockitoJUnitRunner.class)
public class WebTestUtilsTests {
@Mock
private SecurityContextRepository contextRepo;
@Mock
private CsrfTokenRepository csrfRepo;
private MockHttpServletRequest request;
private ConfigurableApplicationContext context;
@Before
@@ -69,22 +72,19 @@ public class WebTestUtilsTests {
@Test
public void getCsrfTokenRepositorytNoWac() {
assertThat(getCsrfTokenRepository(this.request))
.isInstanceOf(HttpSessionCsrfTokenRepository.class);
assertThat(getCsrfTokenRepository(this.request)).isInstanceOf(HttpSessionCsrfTokenRepository.class);
}
@Test
public void getCsrfTokenRepositorytNoSecurity() {
loadConfig(Config.class);
assertThat(getCsrfTokenRepository(this.request))
.isInstanceOf(HttpSessionCsrfTokenRepository.class);
assertThat(getCsrfTokenRepository(this.request)).isInstanceOf(HttpSessionCsrfTokenRepository.class);
}
@Test
public void getCsrfTokenRepositorytSecurityNoCsrf() {
loadConfig(SecurityNoCsrfConfig.class);
assertThat(getCsrfTokenRepository(this.request))
.isInstanceOf(HttpSessionCsrfTokenRepository.class);
assertThat(getCsrfTokenRepository(this.request)).isInstanceOf(HttpSessionCsrfTokenRepository.class);
}
@Test
@@ -99,22 +99,19 @@ public class WebTestUtilsTests {
@Test
public void getSecurityContextRepositoryNoWac() {
assertThat(getSecurityContextRepository(this.request))
.isInstanceOf(HttpSessionSecurityContextRepository.class);
assertThat(getSecurityContextRepository(this.request)).isInstanceOf(HttpSessionSecurityContextRepository.class);
}
@Test
public void getSecurityContextRepositoryNoSecurity() {
loadConfig(Config.class);
assertThat(getSecurityContextRepository(this.request))
.isInstanceOf(HttpSessionSecurityContextRepository.class);
assertThat(getSecurityContextRepository(this.request)).isInstanceOf(HttpSessionSecurityContextRepository.class);
}
@Test
public void getSecurityContextRepositorySecurityNoCsrf() {
loadConfig(SecurityNoCsrfConfig.class);
assertThat(getSecurityContextRepository(this.request))
.isInstanceOf(HttpSessionSecurityContextRepository.class);
assertThat(getSecurityContextRepository(this.request)).isInstanceOf(HttpSessionSecurityContextRepository.class);
}
@Test
@@ -130,8 +127,7 @@ public class WebTestUtilsTests {
public void findFilterNoMatchingFilters() {
loadConfig(PartialSecurityConfig.class);
assertThat(WebTestUtils.findFilter(this.request,
SecurityContextPersistenceFilter.class)).isNull();
assertThat(WebTestUtils.findFilter(this.request, SecurityContextPersistenceFilter.class)).isNull();
}
@Test
@@ -141,11 +137,9 @@ public class WebTestUtilsTests {
CsrfFilter toFind = new CsrfFilter(new HttpSessionCsrfTokenRepository());
FilterChainProxy springSecurityFilterChain = new FilterChainProxy(
new DefaultSecurityFilterChain(AnyRequestMatcher.INSTANCE, toFind));
this.request.getServletContext().setAttribute(
BeanIds.SPRING_SECURITY_FILTER_CHAIN, springSecurityFilterChain);
this.request.getServletContext().setAttribute(BeanIds.SPRING_SECURITY_FILTER_CHAIN, springSecurityFilterChain);
assertThat(WebTestUtils.findFilter(this.request, toFind.getClass()))
.isEqualTo(toFind);
assertThat(WebTestUtils.findFilter(this.request, toFind.getClass())).isEqualTo(toFind);
}
@Test
@@ -155,11 +149,9 @@ public class WebTestUtilsTests {
CsrfFilter toFind = new CsrfFilter(new HttpSessionCsrfTokenRepository());
FilterChainProxy springSecurityFilterChain = new FilterChainProxy(
new DefaultSecurityFilterChain(AnyRequestMatcher.INSTANCE, toFind));
this.request.getServletContext().setAttribute(
BeanIds.SPRING_SECURITY_FILTER_CHAIN, springSecurityFilterChain);
this.request.getServletContext().setAttribute(BeanIds.SPRING_SECURITY_FILTER_CHAIN, springSecurityFilterChain);
assertThat(WebTestUtils.findFilter(this.request, toFind.getClass()))
.isSameAs(toFind);
assertThat(WebTestUtils.findFilter(this.request, toFind.getClass())).isSameAs(toFind);
}
private void loadConfig(Class<?> config) {
@@ -167,12 +159,13 @@ public class WebTestUtilsTests {
context.register(config);
context.refresh();
this.context = context;
this.request.getServletContext().setAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);
this.request.getServletContext().setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
context);
}
@Configuration
static class Config {
}
@EnableWebSecurity
@@ -182,10 +175,12 @@ public class WebTestUtilsTests {
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
}
@EnableWebSecurity
static class CustomSecurityConfig extends WebSecurityConfigurerAdapter {
static CsrfTokenRepository CSRF_REPO;
static SecurityContextRepository CONTEXT_REPO;
@@ -200,6 +195,7 @@ public class WebTestUtilsTests {
.securityContextRepository(CONTEXT_REPO);
// @formatter:on
}
}
@EnableWebSecurity
@@ -212,14 +208,17 @@ public class WebTestUtilsTests {
.antMatcher("/willnotmatchthis");
// @formatter:on
}
}
@Configuration
static class NoSecurityConfig {
}
@EnableWebSecurity
static class SecurityConfigWithDefaults extends WebSecurityConfigurerAdapter {
}
}