EnableResourceServer ломает сервер авторизации oAuth2
Я реализовал сервер авторизации oAuth2, используя Spring Boot версии 1.5.2.RELEASE. Сервер авторизации поддерживает неявный поток. С WebSecurityConfig ниже форма входа ( http://localhost:8200/login) работает хорошо.
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JpaUserDetailsService userDetailsService;
@Bean
@Override
public UserDetailsService userDetailsServiceBean() throws Exception {
return userDetailsService;
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public AuthenticationProvider authenticationProvider() throws Exception {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setUserDetailsService(userDetailsServiceBean());
provider.setPasswordEncoder(passwordEncoder());
return provider;
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return new ProviderManager(singletonList(authenticationProvider()));
}
@Override
public void configure(WebSecurity web) {
web.ignoring()
.antMatchers("/")
.antMatchers("/docs/**")
.antMatchers("/swagger/**")
.antMatchers("/token/**")
.antMatchers("/v2/*")
.antMatchers(HttpMethod.OPTIONS, "/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests().antMatchers("/login**").permitAll().anyRequest().authenticated().and()
.formLogin().loginPage("/login").permitAll().and()
.logout().permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
}
Я хочу, чтобы сервер ресурсов был частью одного и того же приложения. Цель состоит в том, чтобы мне нужна конечная точка /me, которая предоставит мне подробную информацию о зарегистрированном пользователе и конечных точках для управления пользователями. Но как только я добавляю ResourceServerConfig, аннотированный ниже EnableResourceServer, я получаю сообщение об ошибке "Требуется полная аутентификация для доступа к этому ресурсу", когда я запрашиваю http://localhost:8200/login.
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
public static final String RESOURCE_ID = "proclaim-auth";
@Autowired
private ResourceServerTokenServices tokenServices;
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources
.resourceId(RESOURCE_ID)
.tokenServices(tokenServices);
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/api/ **").authenticated();
}
}
Я подозреваю, что цепочка безопасности сервера ресурсов предшествует цепочке безопасности сервера авторизации. Я пытался аннотировать WebSecurityConfig с помощью порядка аннотаций, но это не решило мою проблему:
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
...
}
Что я делаю неправильно? Пожалуйста, порекомендуйте. Заранее спасибо!
РЕДАКТИРОВАТЬ 1 Я добавил метод configure(HttpSecurity http) в ResourceServerConfig и изменил значение аннотации заказа на -1 в WebSecurityConfig. Теперь применяется защита, определенная в WebSecurityConfig, а защита, определенная в ResourceServerConfig, игнорируется. Поэтому, когда я вызываю / мне конечную точку с действующим токеном, я перенаправляюсь на страницу входа.
1 ответ
Причиной проблемы была неправильная настройка безопасности http в классе ResourceServerConfig. Правильная конфигурация следующая:
@Override
public void configure(HttpSecurity http) throws Exception {
http
.requestMatchers().antMatchers("/api/**").and()
.authorizeRequests().anyRequest().authenticated();
}
RequestMatchers будет гарантировать, что эта цепочка безопасности будет обрабатывать только запросы на пути, начинающиеся с "/api/". Все остальные запросы будут переданы в цепочку безопасности, определенную в классе WebSecurityConfig. Мне не хватало этого в моей конфигурации, поэтому все запросы были обработаны цепочкой безопасности ResourceServerConfig, и ни один запрос не достиг цепочки безопасности WebSecurityConfig.