Многократная веб-безопасность, вызывающая ERR_TOO_MANY_REDIRECTS

Я пытаюсь настроить Spring Security через Java Config для обработки двух видов аутентификации в моем приложении: на основе форм (вход пользователя) и на основе токенов (API REST).

Конфигурация формы проста, кроме той части, где я должен был создать свой собственный SecuritySocialConfigurer (в основном копия SpringSocialConfigurer с пользовательским обработчиком успешной аутентификации, который генерирует токен JWT и устанавливает cookie в ответе).

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    super.configure(auth);
    auth
        .userDetailsService(userDetailsService())
        .passwordEncoder(NoOpPasswordEncoder.getInstance());
}

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/css/**", "/img/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .formLogin()
            .loginPage("/signin")
            .loginProcessingUrl("/signin/authenticate")
            .failureUrl("/signin?param.error=bad_credentials")
        .and()
            .logout()
                .logoutUrl("/signout")
                .deleteCookies("JSESSIONID")
        .and()
            .authorizeRequests()
                .antMatchers("/admin/**", "favicon.ico", "/public/**", "/auth/**", "/signin/**").permitAll()
                .antMatchers("/**").hasRole("USER")
        .and()
            .rememberMe()
        .and()
            .apply(new MilesSocialSecurityConfigurer());
}

Когда только эта конфигурация находится в игре, я могу получить доступ http://localhost:8080 и быть перенаправлен на http://localhost:8080/signin выполнить вход. После успешного входа я проверяю наличие файла cookie JWT-токена.

Вторая цель конфигурации безопасности - проверить наличие маркера JWT при вызове REST API.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .addFilterAfter(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
        .antMatcher("/api/**")
            .csrf()
                .disable()
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
            .exceptionHandling()
                .authenticationEntryPoint(restAuthenticationEntryPoint)
        .and()
            .authorizeRequests()
                .antMatchers("favicon.ico", "/public/**", "/auth/**", "/signin/**").permitAll()
                .antMatchers("/**").authenticated()
        ;
}

@Bean
public JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception {
    JwtAuthenticationFilter filter = new JwtAuthenticationFilter("/api/**");
    filter.setAuthenticationSuccessHandler(jwtAuthenticationSuccessHandler);
    filter.setAuthenticationManager(apiAuthenticationManager());
    return filter;
}

@Bean
public ProviderManager apiAuthenticationManager() {
    return new ProviderManager(Arrays.asList(jwtAuthenticationProvider));
}

JwtAuthenticationProvider это класс, который анализирует токен JWT и генерирует UserDetails возражать или бросает AuthenticationException если токен не существует или недействителен

Когда этот второй конфиг на месте, я не могу перейти к http://localhost:8080 (или же /signin), чтобы инициировать процесс входа - браузер возвращает ERR_TOO_MANY_REDIRECTS.

Я попробовал некоторые вещи без какого-либо успеха. Любая подсказка о том, что происходит, будет высоко ценится.

Благодарю.

1 ответ

+ Изменить

.antMatchers("/**").authenticated()

в

 .anyRequest().authenticated()

Это означает, что любой URL, который не соответствует тому, что вы явно определили, потребует аутентификации.

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