Мое приложение, использующее Spring и безопасность 5.2.1 oAuth2, действует как сервер ресурсов и клиент. Эта конфигурация, созданная на основе официальной документации по весенней безопасности, работает не так, как ожидалось. При запросе на api / ** он правильно защищен и действует как сервер ресурсов, но другой URL-адрес не перенаправляет на сервер sso, а на локальную форму входа! Если я удалю ApiWebSecurityConfigurationAdapter, он будет перенаправлен в форму входа sso, но у него нет возможности сервера ресурсов.
Как я могу добиться, чтобы конфигурация работала вместе?
@EnableWebSecurity
public class MultiHttpSecurityConfig {
public static final String jwkSetUri = "https://<url-oidc>/jwks";
@Bean
public UserDetailsService userDetailsService() throws Exception {
// ensure the passwords are encoded properly
UserBuilder users = User.withDefaultPasswordEncoder();
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(users.username("user").password("password").roles("USER").build());
manager.createUser(users.username("admin").password("password").roles("USER","ADMIN").build());
return manager;
}
@Configuration
@Order(1)
public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/api/**")
.authorizeRequests(authorize -> authorize
.anyRequest().hasRole("ADMIN")
)
.csrf().disable()
.formLogin().disable()
.httpBasic().disable()
.oauth2ResourceServer().jwt();
}
@Configuration
public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests(authorize -> authorize
.anyRequest().authenticated()
).csrf().disable()
.formLogin().disable()
.httpBasic().disable()
.oauth2Client()
.and().oauth2Login();
}
@Bean
public ClientRegistrationRepository clientRegistrationRepository() {
return new InMemoryClientRegistrationRepository(this.ssoClientRegistration());
}
private ClientRegistration ssoClientRegistration() {
return ClientRegistration
.withRegistrationId("sso")
.clientId("id")
.clientSecret("secret")
.clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
.redirectUriTemplate("{baseUrl}/{action}/oauth2/code/{registrationId}")
.authorizationUri("https://<url-oidc>/authorize")
.tokenUri("https://<url-oidc>/accessToken")
.userInfoUri("https://<url-oidc>/profile")
.jwkSetUri(MultiHttpSecurityConfig.jwkSetUri)
.clientName("sso").build();
}
}
}