WebSecurityConfigurerAdapter is Deprecated

Spring Boot 2.7 WebSecurityConfigurerAdapter is Deprecated

Ao tentar configurar o Spring Security na sua aplicação Spring Boot você está recebendo do compilador de sua IDE a mensagem WebSecurityConfigurerAdapter is Deprecated?

SpringSecurityConfig

Se sim, o problema não é com Spring Boot, mas o resultado de uma atualização recente que ocorreu no Spring Security. O Spring Security versão 5.7.0 (e superiores) recebeu tal atualização e por conta disso, os projetos Spring Boot com versões superiores a 2.7.0 terão essa atualização refletida por fazerem uso das novas versões do Spring Security.

Spring Security com WebSecurityConfigurerAdapter

As versões anteriores a 5.7.0 do Spring Security dependiam que uma configuração semelhante ao código abaixo fosse realizada:

@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
         
        // configuração ...
         
    }
 
    @Override
    public void configure(WebSecurity web) throws Exception {
         
        // configuração ...
         
    }      
}

Basicamente, ao estender a classe WebSecurityConfigurerAdapter, nós sobrescrevemos os métodos configure() para adicionar as regras de segurança em nossas aplicações. Entretanto, os desenvolvedores, do projeto Spring Security, resolveram incentivar a configuração de segurança com base em componentes e não mais em herança..

Spring Security sem WebSecurityConfigurerAdapter

A atualização realizada reflete em uma nova forma de manipular os métodos com as regras de seguranças. Em vez de você estender a classe WebSecurityConfigurerAdapter e fazer uso dos métodos configure(), agora você deve declarar beans do Spring do tipo SecurityFilterChain e/ou WebSecurityCustomizer da seguinte maneira:

@EnableWebSecurity
public class SecurityConfiguration {
         
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // configuração ...
    }
     
    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        // configuração ...     
    }         
}

Observando os métodos com atenção e comparando-os com as versões anteriores, podemos ver que os métodos configure() eram do tipo void, e agora com a criação de beans, os novos métodos passam a ter retornos do tipo SecurityFilterChain e WebSecurityCustomizer.

Então, como lidar com esses retornos? Veremos a seguir em um exemplo bastante simples de uma configuração para uma operação do tipo REST:

@EnableWebSecurity
public class SecurityConfiguration {
         
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/blog/**").hasRole("USER")
                .anyRequest().authenticated()
                .and().httpBasic()
                .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and().build();
    }
     
    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring()
                           .antMatchers("/images/**", "/js/**", "/webjars/**");     
    }
         
}

O objeto HttpSecurity, de filterChain(), possui o método build() que retorna um objeto SecurityFilterChain para finalizar a operação de retorno.

Porém, caso queira usar o método webSecurityCustomizer(), como ele não possui um argumento, usamos uma expressão lambda a partir do seu tipo de retorno. Lembrando que, o Spring Security lança mensagens no log de inicialização que desencorajam ao uso do método ignoring() e informando que deveríamos substituir esse tipo de declaração pelo permitAll().

Conforme vimos não tivemos uma mudança tão drástica, mas é importante tomar cuidado ao atualizar sua aplicação Spring Boot ou aquela que use o Spring Security, porque terá que lidar com essas mudanças. Além disso, lembre-se que todos os demais métodos que podiam ser herdados de WebSecurityConfigurerAdapter agora estão em desuso também. Por isso, busque na documentação a melhor forma de substituí-los ou dê uma lida no artigo do blog oficial do Spring.io, segue o link:

Até a próxima!

Ballem

Marcio Ballem é bacharel em Sistemas de Informação pelo Centro Universitário Franciscano em Santa Maria/RS. Tem experiência com desenvolvimento Delphi e Java em projetos para gestão pública e acadêmica. Possui certificação em Java, OCJP 6.

Você pode gostar...