|
@@ -1,5 +1,5 @@
|
|
/*
|
|
/*
|
|
- * Copyright 2002-2019 the original author or authors.
|
|
|
|
|
|
+ * Copyright 2002-2022 the original author or authors.
|
|
*
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* you may not use this file except in compliance with the License.
|
|
@@ -21,7 +21,9 @@ import org.junit.jupiter.api.extension.ExtendWith;
|
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.context.annotation.Bean;
|
|
import org.springframework.context.annotation.Bean;
|
|
|
|
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
import org.springframework.security.config.annotation.ObjectPostProcessor;
|
|
import org.springframework.security.config.annotation.ObjectPostProcessor;
|
|
|
|
+import org.springframework.security.config.annotation.SecurityContextChangedListenerConfig;
|
|
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
|
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|
import org.springframework.security.config.annotation.web.builders.WebSecurity;
|
|
import org.springframework.security.config.annotation.web.builders.WebSecurity;
|
|
@@ -30,6 +32,8 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur
|
|
import org.springframework.security.config.test.SpringTestContext;
|
|
import org.springframework.security.config.test.SpringTestContext;
|
|
import org.springframework.security.config.test.SpringTestContextExtension;
|
|
import org.springframework.security.config.test.SpringTestContextExtension;
|
|
import org.springframework.security.config.users.AuthenticationTestConfiguration;
|
|
import org.springframework.security.config.users.AuthenticationTestConfiguration;
|
|
|
|
+import org.springframework.security.core.context.SecurityContextChangedListener;
|
|
|
|
+import org.springframework.security.core.context.SecurityContextHolderStrategy;
|
|
import org.springframework.security.core.userdetails.PasswordEncodedUser;
|
|
import org.springframework.security.core.userdetails.PasswordEncodedUser;
|
|
import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders;
|
|
import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders;
|
|
import org.springframework.security.web.PortMapper;
|
|
import org.springframework.security.web.PortMapper;
|
|
@@ -42,10 +46,12 @@ import org.springframework.test.web.servlet.MockMvc;
|
|
|
|
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
import static org.mockito.BDDMockito.given;
|
|
import static org.mockito.BDDMockito.given;
|
|
|
|
+import static org.mockito.Mockito.atLeastOnce;
|
|
import static org.mockito.Mockito.mock;
|
|
import static org.mockito.Mockito.mock;
|
|
import static org.mockito.Mockito.spy;
|
|
import static org.mockito.Mockito.spy;
|
|
import static org.mockito.Mockito.verify;
|
|
import static org.mockito.Mockito.verify;
|
|
import static org.springframework.security.config.Customizer.withDefaults;
|
|
import static org.springframework.security.config.Customizer.withDefaults;
|
|
|
|
+import static org.springframework.security.config.annotation.SecurityContextChangedListenerArgumentMatchers.setAuthentication;
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.formLogin;
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.formLogin;
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.logout;
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.logout;
|
|
import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.authenticated;
|
|
import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.authenticated;
|
|
@@ -97,6 +103,24 @@ public class FormLoginConfigurerTests {
|
|
// @formatter:on
|
|
// @formatter:on
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Test
|
|
|
|
+ public void formLoginWhenSecurityContextHolderStrategyThenUses() throws Exception {
|
|
|
|
+ this.spring.register(FormLoginConfig.class, SecurityContextChangedListenerConfig.class).autowire();
|
|
|
|
+ // @formatter:off
|
|
|
|
+ SecurityMockMvcRequestBuilders.FormLoginRequestBuilder loginRequest = formLogin()
|
|
|
|
+ .user("username", "user")
|
|
|
|
+ .password("password", "password");
|
|
|
|
+ this.mockMvc.perform(loginRequest)
|
|
|
|
+ .andExpect(status().isFound())
|
|
|
|
+ .andExpect(redirectedUrl("/"));
|
|
|
|
+ // @formatter:on
|
|
|
|
+ SecurityContextHolderStrategy strategy = this.spring.getContext().getBean(SecurityContextHolderStrategy.class);
|
|
|
|
+ verify(strategy, atLeastOnce()).getContext();
|
|
|
|
+ SecurityContextChangedListener listener = this.spring.getContext()
|
|
|
|
+ .getBean(SecurityContextChangedListener.class);
|
|
|
|
+ verify(listener).securityContextChanged(setAuthentication(UsernamePasswordAuthenticationToken.class));
|
|
|
|
+ }
|
|
|
|
+
|
|
@Test
|
|
@Test
|
|
public void loginWhenFormLoginConfiguredThenHasDefaultFailureUrl() throws Exception {
|
|
public void loginWhenFormLoginConfiguredThenHasDefaultFailureUrl() throws Exception {
|
|
this.spring.register(FormLoginConfig.class).autowire();
|
|
this.spring.register(FormLoginConfig.class).autowire();
|