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.

Другие вопросы по тегам