Upgrade to Spring Security 5.0.0.BUILD-SNAPSHOT
Following some changes in the latest snapshot this includes: - Some updates to oauth2 client auto-config - Security auto-config no longer relies on GlobalAuthenticationConfigurerAdapter - Remove reactive security starter Closes gh-10704
This commit is contained in:
parent
eb446d07d9
commit
8600bd7294
|
|
@ -523,11 +523,6 @@
|
||||||
<artifactId>spring-security-data</artifactId>
|
<artifactId>spring-security-data</artifactId>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.security</groupId>
|
|
||||||
<artifactId>spring-security-webflux</artifactId>
|
|
||||||
<optional>true</optional>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.security</groupId>
|
<groupId>org.springframework.security</groupId>
|
||||||
<artifactId>spring-security-jwt-jose</artifactId>
|
<artifactId>spring-security-jwt-jose</artifactId>
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ import org.springframework.context.annotation.Import;
|
||||||
import org.springframework.security.authentication.AuthenticationEventPublisher;
|
import org.springframework.security.authentication.AuthenticationEventPublisher;
|
||||||
import org.springframework.security.authentication.AuthenticationManager;
|
import org.springframework.security.authentication.AuthenticationManager;
|
||||||
import org.springframework.security.authentication.DefaultAuthenticationEventPublisher;
|
import org.springframework.security.authentication.DefaultAuthenticationEventPublisher;
|
||||||
import org.springframework.security.config.annotation.authentication.configurers.GlobalAuthenticationConfigurerAdapter;
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
||||||
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -42,7 +42,7 @@ import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
||||||
*/
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
@ConditionalOnClass({ AuthenticationManager.class,
|
@ConditionalOnClass({ AuthenticationManager.class,
|
||||||
GlobalAuthenticationConfigurerAdapter.class })
|
EnableWebSecurity.class })
|
||||||
@EnableConfigurationProperties(SecurityProperties.class)
|
@EnableConfigurationProperties(SecurityProperties.class)
|
||||||
@Import({ SpringBootWebSecurityConfiguration.class, WebSecurityEnablerConfiguration.class,
|
@Import({ SpringBootWebSecurityConfiguration.class, WebSecurityEnablerConfiguration.class,
|
||||||
AuthenticationManagerConfiguration.class, SecurityDataConfiguration.class })
|
AuthenticationManagerConfiguration.class, SecurityDataConfiguration.class })
|
||||||
|
|
|
||||||
|
|
@ -16,14 +16,12 @@
|
||||||
|
|
||||||
package org.springframework.boot.autoconfigure.security;
|
package org.springframework.boot.autoconfigure.security;
|
||||||
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.core.annotation.Order;
|
import org.springframework.core.annotation.Order;
|
||||||
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.configuration.EnableWebSecurity;
|
|
||||||
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -36,7 +34,6 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur
|
||||||
* @author Madhura Bhave
|
* @author Madhura Bhave
|
||||||
* @since 2.0.0
|
* @since 2.0.0
|
||||||
*/
|
*/
|
||||||
@ConditionalOnClass(EnableWebSecurity.class)
|
|
||||||
@ConditionalOnMissingBean(WebSecurityConfigurerAdapter.class)
|
@ConditionalOnMissingBean(WebSecurityConfigurerAdapter.class)
|
||||||
@ConditionalOnWebApplication(type = Type.SERVLET)
|
@ConditionalOnWebApplication(type = Type.SERVLET)
|
||||||
public class SpringBootWebSecurityConfiguration {
|
public class SpringBootWebSecurityConfiguration {
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@
|
||||||
package org.springframework.boot.autoconfigure.security;
|
package org.springframework.boot.autoconfigure.security;
|
||||||
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
||||||
|
|
@ -34,7 +33,6 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur
|
||||||
* @since 2.0.0
|
* @since 2.0.0
|
||||||
*/
|
*/
|
||||||
@ConditionalOnBean(WebSecurityConfigurerAdapter.class)
|
@ConditionalOnBean(WebSecurityConfigurerAdapter.class)
|
||||||
@ConditionalOnClass(EnableWebSecurity.class)
|
|
||||||
@ConditionalOnMissingBean(WebSecurityConfiguration.class)
|
@ConditionalOnMissingBean(WebSecurityConfiguration.class)
|
||||||
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
|
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
|
||||||
@EnableWebSecurity
|
@EnableWebSecurity
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ final class OAuth2ClientPropertiesRegistrationAdapter {
|
||||||
throw new IllegalStateException(getErrorMessage(configuredProviderId, registrationId));
|
throw new IllegalStateException(getErrorMessage(configuredProviderId, registrationId));
|
||||||
}
|
}
|
||||||
Builder builder = (provider != null ? provider.getBuilder(registrationId)
|
Builder builder = (provider != null ? provider.getBuilder(registrationId)
|
||||||
: new Builder(registrationId));
|
: ClientRegistration.withRegistrationId(registrationId));
|
||||||
if (providers.containsKey(providerId)) {
|
if (providers.containsKey(providerId)) {
|
||||||
return getBuilder(builder, providers.get(providerId));
|
return getBuilder(builder, providers.get(providerId));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,15 +27,15 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplicat
|
||||||
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.ReactiveAuthenticationManager;
|
import org.springframework.security.authentication.ReactiveAuthenticationManager;
|
||||||
import org.springframework.security.core.userdetails.MapUserDetailsRepository;
|
import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
|
||||||
|
import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
|
||||||
import org.springframework.security.core.userdetails.User;
|
import org.springframework.security.core.userdetails.User;
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
import org.springframework.security.core.userdetails.UserDetailsRepository;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default user {@link Configuration} for a reactive web application. Configures a
|
* Default user {@link Configuration} for a reactive web application. Configures a
|
||||||
* {@link UserDetailsRepository} with a default user and generated password. This
|
* {@link ReactiveUserDetailsService} with a default user and generated password. This
|
||||||
* backs-off completely if there is a bean of type {@link UserDetailsRepository} or
|
* backs-off completely if there is a bean of type {@link ReactiveUserDetailsService} or
|
||||||
* {@link ReactiveAuthenticationManager}.
|
* {@link ReactiveAuthenticationManager}.
|
||||||
*
|
*
|
||||||
* @author Madhura Bhave
|
* @author Madhura Bhave
|
||||||
|
|
@ -44,7 +44,7 @@ import org.springframework.security.core.userdetails.UserDetailsRepository;
|
||||||
@Configuration
|
@Configuration
|
||||||
@ConditionalOnClass({ ReactiveAuthenticationManager.class })
|
@ConditionalOnClass({ ReactiveAuthenticationManager.class })
|
||||||
@ConditionalOnMissingBean({ ReactiveAuthenticationManager.class,
|
@ConditionalOnMissingBean({ ReactiveAuthenticationManager.class,
|
||||||
UserDetailsRepository.class })
|
ReactiveUserDetailsService.class })
|
||||||
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
|
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
|
||||||
public class ReactiveAuthenticationManagerConfiguration {
|
public class ReactiveAuthenticationManagerConfiguration {
|
||||||
|
|
||||||
|
|
@ -52,11 +52,11 @@ public class ReactiveAuthenticationManagerConfiguration {
|
||||||
.getLog(ReactiveAuthenticationManagerConfiguration.class);
|
.getLog(ReactiveAuthenticationManagerConfiguration.class);
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public MapUserDetailsRepository userDetailsRepository() {
|
public MapReactiveUserDetailsService reactiveUserDetailsService() {
|
||||||
String password = UUID.randomUUID().toString();
|
String password = UUID.randomUUID().toString();
|
||||||
logger.info(String.format("%n%nUsing default security password: %s%n", password));
|
logger.info(String.format("%n%nUsing default security password: %s%n", password));
|
||||||
UserDetails user = User.withUsername("user").password(password).roles().build();
|
UserDetails user = User.withUsername("user").password(password).roles().build();
|
||||||
return new MapUserDetailsRepository(user);
|
return new MapReactiveUserDetailsService(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,9 +25,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
|
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
|
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
|
import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.security.user.SecurityConfig;
|
|
||||||
import org.springframework.boot.test.context.SpringBootContextLoader;
|
import org.springframework.boot.test.context.SpringBootContextLoader;
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
import org.springframework.test.annotation.DirtiesContext;
|
import org.springframework.test.annotation.DirtiesContext;
|
||||||
import org.springframework.test.context.ContextConfiguration;
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
|
@ -57,7 +55,6 @@ public class JpaUserDetailsTests {
|
||||||
@Import({ EmbeddedDataSourceConfiguration.class, DataSourceAutoConfiguration.class,
|
@Import({ EmbeddedDataSourceConfiguration.class, DataSourceAutoConfiguration.class,
|
||||||
HibernateJpaAutoConfiguration.class,
|
HibernateJpaAutoConfiguration.class,
|
||||||
PropertyPlaceholderAutoConfiguration.class, SecurityAutoConfiguration.class })
|
PropertyPlaceholderAutoConfiguration.class, SecurityAutoConfiguration.class })
|
||||||
@ComponentScan(basePackageClasses = SecurityConfig.class)
|
|
||||||
public static class Main {
|
public static class Main {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ public class OAuth2ClientPropertiesRegistrationAdapterTests {
|
||||||
assertThat(adapted.getAuthorizationGrantType()).isEqualTo(
|
assertThat(adapted.getAuthorizationGrantType()).isEqualTo(
|
||||||
org.springframework.security.oauth2.core.AuthorizationGrantType.AUTHORIZATION_CODE);
|
org.springframework.security.oauth2.core.AuthorizationGrantType.AUTHORIZATION_CODE);
|
||||||
assertThat(adapted.getRedirectUri()).isEqualTo("http://example.com/redirect");
|
assertThat(adapted.getRedirectUri()).isEqualTo("http://example.com/redirect");
|
||||||
assertThat(adapted.getScope()).containsExactly("scope");
|
assertThat(adapted.getScopes()).containsExactly("scope");
|
||||||
assertThat(adapted.getClientName()).isEqualTo("clientName");
|
assertThat(adapted.getClientName()).isEqualTo("clientName");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -112,7 +112,7 @@ public class OAuth2ClientPropertiesRegistrationAdapterTests {
|
||||||
org.springframework.security.oauth2.core.AuthorizationGrantType.AUTHORIZATION_CODE);
|
org.springframework.security.oauth2.core.AuthorizationGrantType.AUTHORIZATION_CODE);
|
||||||
assertThat(adapted.getRedirectUri()).isEqualTo(
|
assertThat(adapted.getRedirectUri()).isEqualTo(
|
||||||
"{scheme}://{serverName}:{serverPort}{contextPath}/oauth2/authorize/code/{registrationId}");
|
"{scheme}://{serverName}:{serverPort}{contextPath}/oauth2/authorize/code/{registrationId}");
|
||||||
assertThat(adapted.getScope()).containsExactly("openid", "profile", "email",
|
assertThat(adapted.getScopes()).containsExactly("openid", "profile", "email",
|
||||||
"address", "phone");
|
"address", "phone");
|
||||||
assertThat(adapted.getClientName()).isEqualTo("Google");
|
assertThat(adapted.getClientName()).isEqualTo("Google");
|
||||||
}
|
}
|
||||||
|
|
@ -151,7 +151,7 @@ public class OAuth2ClientPropertiesRegistrationAdapterTests {
|
||||||
assertThat(adapted.getAuthorizationGrantType()).isEqualTo(
|
assertThat(adapted.getAuthorizationGrantType()).isEqualTo(
|
||||||
org.springframework.security.oauth2.core.AuthorizationGrantType.AUTHORIZATION_CODE);
|
org.springframework.security.oauth2.core.AuthorizationGrantType.AUTHORIZATION_CODE);
|
||||||
assertThat(adapted.getRedirectUri()).isEqualTo("http://example.com/redirect");
|
assertThat(adapted.getRedirectUri()).isEqualTo("http://example.com/redirect");
|
||||||
assertThat(adapted.getScope()).containsExactly("scope");
|
assertThat(adapted.getScopes()).containsExactly("scope");
|
||||||
assertThat(adapted.getClientName()).isEqualTo("clientName");
|
assertThat(adapted.getClientName()).isEqualTo("clientName");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -196,7 +196,7 @@ public class OAuth2ClientPropertiesRegistrationAdapterTests {
|
||||||
org.springframework.security.oauth2.core.AuthorizationGrantType.AUTHORIZATION_CODE);
|
org.springframework.security.oauth2.core.AuthorizationGrantType.AUTHORIZATION_CODE);
|
||||||
assertThat(adapted.getRedirectUri()).isEqualTo(
|
assertThat(adapted.getRedirectUri()).isEqualTo(
|
||||||
"{scheme}://{serverName}:{serverPort}{contextPath}/oauth2/authorize/code/{registrationId}");
|
"{scheme}://{serverName}:{serverPort}{contextPath}/oauth2/authorize/code/{registrationId}");
|
||||||
assertThat(adapted.getScope()).containsExactly("openid", "profile", "email",
|
assertThat(adapted.getScopes()).containsExactly("openid", "profile", "email",
|
||||||
"address", "phone");
|
"address", "phone");
|
||||||
assertThat(adapted.getClientName()).isEqualTo("Google");
|
assertThat(adapted.getClientName()).isEqualTo("Google");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ import org.springframework.security.oauth2.client.registration.ClientRegistratio
|
||||||
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
|
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
|
||||||
import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository;
|
import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository;
|
||||||
import org.springframework.security.oauth2.client.web.AuthorizationCodeAuthenticationFilter;
|
import org.springframework.security.oauth2.client.web.AuthorizationCodeAuthenticationFilter;
|
||||||
import org.springframework.security.oauth2.client.web.AuthorizationCodeRequestRedirectFilter;
|
import org.springframework.security.oauth2.client.web.AuthorizationRequestRedirectFilter;
|
||||||
import org.springframework.security.oauth2.core.AuthorizationGrantType;
|
import org.springframework.security.oauth2.core.AuthorizationGrantType;
|
||||||
import org.springframework.security.web.FilterChainProxy;
|
import org.springframework.security.web.FilterChainProxy;
|
||||||
import org.springframework.security.web.SecurityFilterChain;
|
import org.springframework.security.web.SecurityFilterChain;
|
||||||
|
|
@ -97,7 +97,7 @@ public class OAuth2WebSecurityConfigurationTests {
|
||||||
.getField(filterChains.get(0), "filters");
|
.getField(filterChains.get(0), "filters");
|
||||||
List<Filter> oauth2Filters = filters.stream()
|
List<Filter> oauth2Filters = filters.stream()
|
||||||
.filter((f) -> f instanceof AuthorizationCodeAuthenticationFilter
|
.filter((f) -> f instanceof AuthorizationCodeAuthenticationFilter
|
||||||
|| f instanceof AuthorizationCodeRequestRedirectFilter)
|
|| f instanceof AuthorizationRequestRedirectFilter)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
return oauth2Filters.stream()
|
return oauth2Filters.stream()
|
||||||
.filter((f) -> f instanceof AuthorizationCodeAuthenticationFilter)
|
.filter((f) -> f instanceof AuthorizationCodeAuthenticationFilter)
|
||||||
|
|
@ -111,7 +111,7 @@ public class OAuth2WebSecurityConfigurationTests {
|
||||||
&& ObjectUtils.nullSafeEquals(reg1.getClientName(), reg2.getClientName());
|
&& ObjectUtils.nullSafeEquals(reg1.getClientName(), reg2.getClientName());
|
||||||
result = result && ObjectUtils.nullSafeEquals(reg1.getClientSecret(),
|
result = result && ObjectUtils.nullSafeEquals(reg1.getClientSecret(),
|
||||||
reg2.getClientSecret());
|
reg2.getClientSecret());
|
||||||
result = result && ObjectUtils.nullSafeEquals(reg1.getScope(), reg2.getScope());
|
result = result && ObjectUtils.nullSafeEquals(reg1.getScopes(), reg2.getScopes());
|
||||||
result = result && ObjectUtils.nullSafeEquals(reg1.getRedirectUri(),
|
result = result && ObjectUtils.nullSafeEquals(reg1.getRedirectUri(),
|
||||||
reg2.getRedirectUri());
|
reg2.getRedirectUri());
|
||||||
result = result && ObjectUtils.nullSafeEquals(reg1.getRegistrationId(),
|
result = result && ObjectUtils.nullSafeEquals(reg1.getRegistrationId(),
|
||||||
|
|
@ -154,7 +154,7 @@ public class OAuth2WebSecurityConfigurationTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
private ClientRegistration getClientRegistration(String id, String userInfoUri) {
|
private ClientRegistration getClientRegistration(String id, String userInfoUri) {
|
||||||
ClientRegistration.Builder builder = new ClientRegistration.Builder(id);
|
ClientRegistration.Builder builder = ClientRegistration.withRegistrationId(id);
|
||||||
builder.clientName("foo").clientId("foo")
|
builder.clientName("foo").clientId("foo")
|
||||||
.clientAuthenticationMethod(
|
.clientAuthenticationMethod(
|
||||||
org.springframework.security.oauth2.core.ClientAuthenticationMethod.BASIC)
|
org.springframework.security.oauth2.core.ClientAuthenticationMethod.BASIC)
|
||||||
|
|
|
||||||
|
|
@ -29,14 +29,14 @@ import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.http.server.reactive.HttpHandler;
|
import org.springframework.http.server.reactive.HttpHandler;
|
||||||
import org.springframework.security.authentication.ReactiveAuthenticationManager;
|
import org.springframework.security.authentication.ReactiveAuthenticationManager;
|
||||||
import org.springframework.security.config.annotation.web.reactive.HttpSecurityConfiguration;
|
import org.springframework.security.config.annotation.web.reactive.ServerHttpSecurityConfiguration;
|
||||||
import org.springframework.security.config.annotation.web.reactive.WebFluxSecurityConfiguration;
|
import org.springframework.security.config.annotation.web.reactive.WebFluxSecurityConfiguration;
|
||||||
import org.springframework.security.core.Authentication;
|
import org.springframework.security.core.Authentication;
|
||||||
import org.springframework.security.core.userdetails.MapUserDetailsRepository;
|
import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
|
||||||
|
import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
|
||||||
import org.springframework.security.core.userdetails.User;
|
import org.springframework.security.core.userdetails.User;
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
import org.springframework.security.core.userdetails.UserDetailsRepository;
|
import org.springframework.security.web.server.WebFilterChainProxy;
|
||||||
import org.springframework.security.web.server.WebFilterChainFilter;
|
|
||||||
import org.springframework.web.reactive.config.EnableWebFlux;
|
import org.springframework.web.reactive.config.EnableWebFlux;
|
||||||
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
|
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
|
||||||
|
|
||||||
|
|
@ -58,11 +58,11 @@ public class ReactiveSecurityAutoConfigurationTests {
|
||||||
.withConfiguration(
|
.withConfiguration(
|
||||||
AutoConfigurations.of(ReactiveSecurityAutoConfiguration.class))
|
AutoConfigurations.of(ReactiveSecurityAutoConfiguration.class))
|
||||||
.run((context) -> {
|
.run((context) -> {
|
||||||
assertThat(context).getBean(HttpSecurityConfiguration.class)
|
assertThat(context).getBean(ServerHttpSecurityConfiguration.class)
|
||||||
.isNotNull();
|
.isNotNull();
|
||||||
assertThat(context).getBean(WebFluxSecurityConfiguration.class)
|
assertThat(context).getBean(WebFluxSecurityConfiguration.class)
|
||||||
.isNotNull();
|
.isNotNull();
|
||||||
assertThat(context).getBean(WebFilterChainFilter.class).isNotNull();
|
assertThat(context).getBean(WebFilterChainProxy.class).isNotNull();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -72,9 +72,9 @@ public class ReactiveSecurityAutoConfigurationTests {
|
||||||
.withConfiguration(
|
.withConfiguration(
|
||||||
AutoConfigurations.of(ReactiveSecurityAutoConfiguration.class))
|
AutoConfigurations.of(ReactiveSecurityAutoConfiguration.class))
|
||||||
.run((context) -> {
|
.run((context) -> {
|
||||||
UserDetailsRepository userDetailsRepository = context
|
ReactiveUserDetailsService userDetailsService = context
|
||||||
.getBean(UserDetailsRepository.class);
|
.getBean(ReactiveUserDetailsService.class);
|
||||||
assertThat(userDetailsRepository.findByUsername("user").block())
|
assertThat(userDetailsService.findByUsername("user").block())
|
||||||
.isNotNull();
|
.isNotNull();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -85,13 +85,13 @@ public class ReactiveSecurityAutoConfigurationTests {
|
||||||
.withConfiguration(
|
.withConfiguration(
|
||||||
AutoConfigurations.of(ReactiveSecurityAutoConfiguration.class))
|
AutoConfigurations.of(ReactiveSecurityAutoConfiguration.class))
|
||||||
.run((context) -> {
|
.run((context) -> {
|
||||||
UserDetailsRepository userDetailsRepository = context
|
ReactiveUserDetailsService userDetailsService = context
|
||||||
.getBean(UserDetailsRepository.class);
|
.getBean(ReactiveUserDetailsService.class);
|
||||||
assertThat(userDetailsRepository.findByUsername("user").block())
|
assertThat(userDetailsService.findByUsername("user").block())
|
||||||
.isNull();
|
.isNull();
|
||||||
assertThat(userDetailsRepository.findByUsername("foo").block())
|
assertThat(userDetailsService.findByUsername("foo").block())
|
||||||
.isNotNull();
|
.isNotNull();
|
||||||
assertThat(userDetailsRepository.findByUsername("admin").block())
|
assertThat(userDetailsService.findByUsername("admin").block())
|
||||||
.isNotNull();
|
.isNotNull();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -103,7 +103,7 @@ public class ReactiveSecurityAutoConfigurationTests {
|
||||||
TestConfig.class)
|
TestConfig.class)
|
||||||
.withConfiguration(
|
.withConfiguration(
|
||||||
AutoConfigurations.of(ReactiveSecurityAutoConfiguration.class))
|
AutoConfigurations.of(ReactiveSecurityAutoConfiguration.class))
|
||||||
.run((context) -> assertThat(context).getBean(UserDetailsRepository.class)
|
.run((context) -> assertThat(context).getBean(ReactiveUserDetailsService.class)
|
||||||
.isNull());
|
.isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -127,12 +127,12 @@ public class ReactiveSecurityAutoConfigurationTests {
|
||||||
static class UserConfig {
|
static class UserConfig {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public MapUserDetailsRepository userDetailsRepository() {
|
public MapReactiveUserDetailsService userDetailsService() {
|
||||||
UserDetails foo = User.withUsername("foo").password("foo").roles("USER")
|
UserDetails foo = User.withUsername("foo").password("foo").roles("USER")
|
||||||
.build();
|
.build();
|
||||||
UserDetails admin = User.withUsername("admin").password("admin")
|
UserDetails admin = User.withUsername("admin").password("admin")
|
||||||
.roles("USER", "ADMIN").build();
|
.roles("USER", "ADMIN").build();
|
||||||
return new MapUserDetailsRepository(foo, admin);
|
return new MapReactiveUserDetailsService(foo, admin);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2012-2017 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.springframework.boot.autoconfigure.security.user;
|
|
||||||
|
|
||||||
import org.springframework.boot.autoconfigure.domain.EntityScan;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
|
||||||
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
|
||||||
import org.springframework.security.config.annotation.authentication.configurers.GlobalAuthenticationConfigurerAdapter;
|
|
||||||
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
|
|
||||||
|
|
||||||
@Configuration
|
|
||||||
@EnableGlobalMethodSecurity(securedEnabled = true)
|
|
||||||
@EntityScan(basePackageClasses = User.class)
|
|
||||||
@EnableJpaRepositories(basePackageClasses = User.class)
|
|
||||||
public class SecurityConfig extends GlobalAuthenticationConfigurerAdapter {
|
|
||||||
|
|
||||||
protected final UserRepository userRepository;
|
|
||||||
|
|
||||||
public SecurityConfig(UserRepository userRepository) {
|
|
||||||
this.userRepository = userRepository;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(AuthenticationManagerBuilder auth) throws Exception {
|
|
||||||
System.err.println("Global security config");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -154,7 +154,7 @@
|
||||||
<spring-plugin.version>1.2.0.RELEASE</spring-plugin.version>
|
<spring-plugin.version>1.2.0.RELEASE</spring-plugin.version>
|
||||||
<spring-restdocs.version>1.2.2.RELEASE</spring-restdocs.version>
|
<spring-restdocs.version>1.2.2.RELEASE</spring-restdocs.version>
|
||||||
<spring-retry.version>1.2.1.RELEASE</spring-retry.version>
|
<spring-retry.version>1.2.1.RELEASE</spring-retry.version>
|
||||||
<spring-security.version>5.0.0.M5</spring-security.version>
|
<spring-security.version>5.0.0.BUILD-SNAPSHOT</spring-security.version>
|
||||||
<spring-session.version>2.0.0.M5</spring-session.version>
|
<spring-session.version>2.0.0.M5</spring-session.version>
|
||||||
<spring-session-data-mongodb.version>2.0.0.M4</spring-session-data-mongodb.version>
|
<spring-session-data-mongodb.version>2.0.0.M4</spring-session-data-mongodb.version>
|
||||||
<spring-social.version>2.0.0.M4</spring-social.version>
|
<spring-social.version>2.0.0.M4</spring-social.version>
|
||||||
|
|
|
||||||
|
|
@ -712,11 +712,6 @@
|
||||||
<artifactId>spring-security-test</artifactId>
|
<artifactId>spring-security-test</artifactId>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.security</groupId>
|
|
||||||
<artifactId>spring-security-webflux</artifactId>
|
|
||||||
<optional>true</optional>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.session</groupId>
|
<groupId>org.springframework.session</groupId>
|
||||||
<artifactId>spring-session-core</artifactId>
|
<artifactId>spring-session-core</artifactId>
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,6 @@
|
||||||
<module>spring-boot-starter-quartz</module>
|
<module>spring-boot-starter-quartz</module>
|
||||||
<module>spring-boot-starter-reactor-netty</module>
|
<module>spring-boot-starter-reactor-netty</module>
|
||||||
<module>spring-boot-starter-security</module>
|
<module>spring-boot-starter-security</module>
|
||||||
<module>spring-boot-starter-security-reactive</module>
|
|
||||||
<module>spring-boot-starter-social-facebook</module>
|
<module>spring-boot-starter-social-facebook</module>
|
||||||
<module>spring-boot-starter-social-twitter</module>
|
<module>spring-boot-starter-social-twitter</module>
|
||||||
<module>spring-boot-starter-social-linkedin</module>
|
<module>spring-boot-starter-social-linkedin</module>
|
||||||
|
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starters</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</parent>
|
|
||||||
<artifactId>spring-boot-starter-security-reactive</artifactId>
|
|
||||||
<name>Spring Boot Security Reactive Starter</name>
|
|
||||||
<description>Starter for using reactive Spring Security</description>
|
|
||||||
<properties>
|
|
||||||
<main.basedir>${basedir}/../../..</main.basedir>
|
|
||||||
</properties>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework</groupId>
|
|
||||||
<artifactId>spring-aop</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.security</groupId>
|
|
||||||
<artifactId>spring-security-config</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.security</groupId>
|
|
||||||
<artifactId>spring-security-webflux</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
provides: spring-security-webflux,spring-security-config
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-security-reactive</artifactId>
|
<artifactId>spring-boot-starter-security</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- Test -->
|
<!-- Test -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,9 @@ package sample.secure.webflux;
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.security.core.userdetails.MapUserDetailsRepository;
|
import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
|
||||||
|
import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
|
||||||
import org.springframework.security.core.userdetails.User;
|
import org.springframework.security.core.userdetails.User;
|
||||||
import org.springframework.security.core.userdetails.UserDetailsRepository;
|
|
||||||
import org.springframework.web.reactive.function.server.RouterFunction;
|
import org.springframework.web.reactive.function.server.RouterFunction;
|
||||||
import org.springframework.web.reactive.function.server.ServerResponse;
|
import org.springframework.web.reactive.function.server.ServerResponse;
|
||||||
|
|
||||||
|
|
@ -41,8 +41,8 @@ public class SampleSecureWebFluxApplication {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public UserDetailsRepository userDetailsRepository() {
|
public ReactiveUserDetailsService userDetailsRepository() {
|
||||||
return new MapUserDetailsRepository(
|
return new MapReactiveUserDetailsService(
|
||||||
User.withUsername("foo").password("password").roles("USER").build());
|
User.withUsername("foo").password("password").roles("USER").build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,19 +18,21 @@ package sample.security.method;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.springframework.boot.actuate.autoconfigure.security.EndpointRequest;
|
import org.springframework.boot.actuate.autoconfigure.security.EndpointRequest;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.core.Ordered;
|
import org.springframework.core.Ordered;
|
||||||
import org.springframework.core.annotation.Order;
|
import org.springframework.core.annotation.Order;
|
||||||
import org.springframework.security.access.annotation.Secured;
|
import org.springframework.security.access.annotation.Secured;
|
||||||
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
|
||||||
import org.springframework.security.config.annotation.authentication.configurers.GlobalAuthenticationConfigurerAdapter;
|
|
||||||
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
|
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
|
||||||
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.configuration.WebSecurityConfigurerAdapter;
|
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
||||||
|
import org.springframework.security.core.userdetails.User;
|
||||||
|
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
||||||
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
|
@ -67,14 +69,14 @@ public class SampleMethodSecurityApplication implements WebMvcConfigurer {
|
||||||
|
|
||||||
@Order(Ordered.HIGHEST_PRECEDENCE)
|
@Order(Ordered.HIGHEST_PRECEDENCE)
|
||||||
@Configuration
|
@Configuration
|
||||||
protected static class AuthenticationSecurity
|
protected static class AuthenticationSecurity {
|
||||||
extends GlobalAuthenticationConfigurerAdapter {
|
|
||||||
|
|
||||||
@Override
|
@Bean
|
||||||
public void init(AuthenticationManagerBuilder auth) throws Exception {
|
public InMemoryUserDetailsManager inMemoryUserDetailsManager() throws Exception {
|
||||||
auth.inMemoryAuthentication().withUser("admin").password("admin")
|
String password = UUID.randomUUID().toString();
|
||||||
.roles("ADMIN", "USER", "ACTUATOR").and().withUser("user")
|
return new InMemoryUserDetailsManager(
|
||||||
.password("user").roles("USER");
|
User.withUsername("admin").password("admin").roles("ADMIN", "USER", "ACTUATOR").build(),
|
||||||
|
User.withUsername("user").password("user").roles("USER").build());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue