Обновление конфигурации безопасности Spring для Springboot версии 3.x

Я обновляю Springboot 2.7.x до версии 3.1.x и заметил изменения в конфигурации безопасности. Я выполнил шаги, описанные в Spring Security , и столкнулся с проблемой преобразования приведенной ниже конфигурации в последнюю версию, которая поддерживается в Springboot 3.1.x.

Помогите пожалуйста с новой конфигурацией.

Переписывание проблемы ниже:

      @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.sessionManagement().sessionCreationPolicy(STATELESS).and().exceptionHandling()
            .defaultAuthenticationEntryPointFor(forbiddenEntryPoint(), PROTECTED_URLS).and()
            .csrf().disable().authorizeRequests()
            .anyRequest().authenticated()
            .and().httpBasic()
            .authenticationEntryPoint(AuthenticationEntryPoint);
  }

Полный код:

      package test.config;

import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.authentication.HttpStatusEntryPoint;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.NegatedRequestMatcher;
import org.springframework.security.web.util.matcher.OrRequestMatcher;
import org.springframework.security.web.util.matcher.RequestMatcher;

import static org.springframework.http.HttpStatus.FORBIDDEN;
import static org.springframework.security.config.http.SessionCreationPolicy.STATELESS;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private static final RequestMatcher PUBLIC_URLS = new OrRequestMatcher(new AntPathRequestMatcher("/public/**/**"));
    private static final RequestMatcher PROTECTED_URLS = new NegatedRequestMatcher(PUBLIC_URLS);
    private final AuthenticationEntryPoint AuthenticationEntryPoint;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Bean
    private static AuthenticationEntryPoint forbiddenEntryPoint() {
        return new HttpStatusEntryPoint(FORBIDDEN);
    }

    @Override
    public void configure(WebSecurity web) {
        web.ignoring().requestMatchers(PUBLIC_URLS);
        web.ignoring().antMatchers("/", "/csrf", "/configuration/ui", "/webjars/**", "/actuator", "/actuator/*");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.sessionManagement().sessionCreationPolicy(STATELESS).and().exceptionHandling()
                .defaultAuthenticationEntryPointFor(forbiddenEntryPoint(), PROTECTED_URLS).and()
                .csrf().disable().authorizeRequests()
                .anyRequest().authenticated()
                .and().httpBasic()
                .authenticationEntryPoint(AuthenticationEntryPoint);
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("userName").password(passwordEncoder.encode("passWord")).roles("Application");
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

Также попробовал решения, представленные в ссылке: https://www.bezkoder.com/websecurityconfigureradapter-deprecated-spring-boot/

2 ответа

Начиная с Spring Security 6, WebSecurityConfigurerAdapter устарел, и вам необходимо внести такие же небольшие изменения. Для получения более подробной информации о том, как изменить, проверьте его и Руководство по миграции .

А по поводу твоей проблемы, что у тебя с:

protected void configure(HttpSecurity http) throws Exception

Вам следует изменить его на:

        @Bean
  public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.sessionManagement(sessionAuthenticationStrategy ->
        sessionAuthenticationStrategy.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
    http.exceptionHandling(eH -> eH.defaultAuthenticationEntryPointFor(
        forbiddenEntryPoint(), PROTECTED_URLS
    ));
    http
        .csrf(AbstractHttpConfigurer::disable);
    http.authorizeHttpRequests(request ->{
      request.anyRequest().authenticated();
    });
    http.httpBasic(Customizer.withDefaults());
    
    return http.build();
  };

Также возможно объявитьauthenticationEntryPointв

      .httpBasic(hbc -> hbc.authenticationEntryPoint(authenticationEntryPoint))

См. Как исправить, что SpringauthorizeRequests устарел?

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