Обновление конфигурации безопасности 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))