|
@@ -26,6 +26,8 @@ import org.springframework.beans.factory.BeanCreationException;
|
|
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.context.annotation.Configuration;
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
|
+import org.springframework.security.authentication.RememberMeAuthenticationToken;
|
|
|
|
+import org.springframework.security.authentication.TestAuthentication;
|
|
import org.springframework.security.authorization.AuthorizationDecision;
|
|
import org.springframework.security.authorization.AuthorizationDecision;
|
|
import org.springframework.security.authorization.AuthorizationEventPublisher;
|
|
import org.springframework.security.authorization.AuthorizationEventPublisher;
|
|
import org.springframework.security.authorization.AuthorizationManager;
|
|
import org.springframework.security.authorization.AuthorizationManager;
|
|
@@ -35,7 +37,10 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
|
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.core.authority.AuthorityUtils;
|
|
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
|
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
|
|
|
+import org.springframework.security.core.userdetails.UserDetailsService;
|
|
|
|
+import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
|
import org.springframework.security.web.SecurityFilterChain;
|
|
import org.springframework.security.web.SecurityFilterChain;
|
|
import org.springframework.security.web.access.expression.WebExpressionAuthorizationManager;
|
|
import org.springframework.security.web.access.expression.WebExpressionAuthorizationManager;
|
|
import org.springframework.security.web.access.intercept.AuthorizationFilter;
|
|
import org.springframework.security.web.access.intercept.AuthorizationFilter;
|
|
@@ -57,6 +62,7 @@ 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.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.authentication;
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
|
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
|
@@ -492,6 +498,50 @@ public class AuthorizeHttpRequestsConfigurerTests {
|
|
};
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Test
|
|
|
|
+ public void getWhenFullyAuthenticatedConfiguredAndRememberMeTokenThenRespondsWithUnauthorized() throws Exception {
|
|
|
|
+ this.spring.register(FullyAuthenticatedConfig.class, BasicController.class).autowire();
|
|
|
|
+ RememberMeAuthenticationToken rememberMe = new RememberMeAuthenticationToken("key", "user",
|
|
|
|
+ AuthorityUtils.createAuthorityList("ROLE_USER"));
|
|
|
|
+ MockHttpServletRequestBuilder requestWithRememberMe = get("/").with(authentication(rememberMe));
|
|
|
|
+ this.mvc.perform(requestWithRememberMe).andExpect(status().isUnauthorized());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void getWhenFullyAuthenticatedConfiguredAndUserThenRespondsWithOk() throws Exception {
|
|
|
|
+ this.spring.register(FullyAuthenticatedConfig.class, BasicController.class).autowire();
|
|
|
|
+ MockHttpServletRequestBuilder requestWithUser = get("/").with(user("user").roles("USER"));
|
|
|
|
+ this.mvc.perform(requestWithUser).andExpect(status().isOk());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void getWhenRememberMeConfiguredAndNoUserThenRespondsWithUnauthorized() throws Exception {
|
|
|
|
+ this.spring.register(RememberMeConfig.class, BasicController.class).autowire();
|
|
|
|
+ this.mvc.perform(get("/")).andExpect(status().isUnauthorized());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void getWhenRememberMeConfiguredAndRememberMeTokenThenRespondsWithOk() throws Exception {
|
|
|
|
+ this.spring.register(RememberMeConfig.class, BasicController.class).autowire();
|
|
|
|
+ RememberMeAuthenticationToken rememberMe = new RememberMeAuthenticationToken("key", "user",
|
|
|
|
+ AuthorityUtils.createAuthorityList("ROLE_USER"));
|
|
|
|
+ MockHttpServletRequestBuilder requestWithRememberMe = get("/").with(authentication(rememberMe));
|
|
|
|
+ this.mvc.perform(requestWithRememberMe).andExpect(status().isOk());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void getWhenAnonymousConfiguredAndAnonymousUserThenRespondsWithOk() throws Exception {
|
|
|
|
+ this.spring.register(AnonymousConfig.class, BasicController.class).autowire();
|
|
|
|
+ this.mvc.perform(get("/")).andExpect(status().isOk());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void getWhenAnonymousConfiguredAndLoggedInUserThenRespondsWithForbidden() throws Exception {
|
|
|
|
+ this.spring.register(AnonymousConfig.class, BasicController.class).autowire();
|
|
|
|
+ MockHttpServletRequestBuilder requestWithUser = get("/").with(user("user"));
|
|
|
|
+ this.mvc.perform(requestWithUser).andExpect(status().isForbidden());
|
|
|
|
+ }
|
|
|
|
+
|
|
@EnableWebSecurity
|
|
@EnableWebSecurity
|
|
static class NoRequestsConfig {
|
|
static class NoRequestsConfig {
|
|
|
|
|
|
@@ -887,6 +937,74 @@ public class AuthorizeHttpRequestsConfigurerTests {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @EnableWebSecurity
|
|
|
|
+ static class FullyAuthenticatedConfig {
|
|
|
|
+
|
|
|
|
+ @Bean
|
|
|
|
+ SecurityFilterChain chain(HttpSecurity http) throws Exception {
|
|
|
|
+ // @formatter:off
|
|
|
|
+ http
|
|
|
|
+ .httpBasic()
|
|
|
|
+ .and()
|
|
|
|
+ .rememberMe()
|
|
|
|
+ .and()
|
|
|
|
+ .authorizeHttpRequests((requests) -> requests
|
|
|
|
+ .anyRequest().fullyAuthenticated()
|
|
|
|
+ );
|
|
|
|
+ // @formatter:on
|
|
|
|
+ return http.build();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Bean
|
|
|
|
+ UserDetailsService userDetailsService() {
|
|
|
|
+ return new InMemoryUserDetailsManager(TestAuthentication.user());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @EnableWebSecurity
|
|
|
|
+ static class RememberMeConfig {
|
|
|
|
+
|
|
|
|
+ @Bean
|
|
|
|
+ SecurityFilterChain chain(HttpSecurity http) throws Exception {
|
|
|
|
+ // @formatter:off
|
|
|
|
+ http
|
|
|
|
+ .httpBasic()
|
|
|
|
+ .and()
|
|
|
|
+ .rememberMe()
|
|
|
|
+ .and()
|
|
|
|
+ .authorizeHttpRequests((requests) -> requests
|
|
|
|
+ .anyRequest().rememberMe()
|
|
|
|
+ );
|
|
|
|
+ // @formatter:on
|
|
|
|
+ return http.build();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Bean
|
|
|
|
+ UserDetailsService userDetailsService() {
|
|
|
|
+ return new InMemoryUserDetailsManager(TestAuthentication.user());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @EnableWebSecurity
|
|
|
|
+ static class AnonymousConfig {
|
|
|
|
+
|
|
|
|
+ @Bean
|
|
|
|
+ SecurityFilterChain chain(HttpSecurity http) throws Exception {
|
|
|
|
+ // @formatter:off
|
|
|
|
+ http
|
|
|
|
+ .httpBasic()
|
|
|
|
+ .and()
|
|
|
|
+ .authorizeHttpRequests((requests) -> requests
|
|
|
|
+ .anyRequest().anonymous()
|
|
|
|
+ );
|
|
|
|
+ // @formatter:on
|
|
|
|
+ return http.build();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
@Configuration
|
|
@Configuration
|
|
static class AuthorizationEventPublisherConfig {
|
|
static class AuthorizationEventPublisherConfig {
|
|
|
|
|