Reformat code using spring-javaformat
Run `./gradlew format` to reformat all java files. Issue gh-8945
This commit is contained in:
@@ -72,4 +72,5 @@ public class TestSecurityContextHolderTests {
|
||||
|
||||
assertThat(TestSecurityContextHolder.getContext().getAuthentication()).isSameAs(authentication);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 + '\'' + '}';
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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";
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -19,5 +19,7 @@ package org.springframework.security.test.context.showcase.service;
|
||||
* @author Rob Winch
|
||||
*/
|
||||
public interface MessageService {
|
||||
|
||||
String getMessage();
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -92,10 +92,14 @@ public class SecurityMockMvcRequestPostProcessorsAuthenticationStatelessTests {
|
||||
|
||||
@RestController
|
||||
static class Controller {
|
||||
|
||||
@RequestMapping
|
||||
public String hello() {
|
||||
return "Hello";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -106,5 +106,7 @@ public class Gh3409Tests {
|
||||
// @formatter:on
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -83,5 +83,7 @@ public class CsrfShowcaseTests {
|
||||
.withUser("user").password("password").roles("USER");
|
||||
// @formatter:on
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user