스프링애플리케이션에서 스프링 시큐리티를 사용할 때

 

“The type WebSecurityConfigurerAdapter is deprecated”

 

경고를 제거하는 방법✍🏻

 

 

 

많은 사람들은  아래 방법과 같은 WebSecurityConfigurerAdapter 추상 클래스를 확장하는 Spring 구성 클래스를 사용하는 데 익숙할 것입니다.

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
         
        // configure HTTP security...
         
    }
 
    @Override
    public void configure(WebSecurity web) throws Exception {
         
        // configure Web security...
         
    }      
}

해당 방법은

'Spring Security 버전 5.6.5' 또는 이전 버전'  

'Spring Boot 버전 2.6.8 또는 이전 버전'

에서는 문제가 없습니다.

 

그러나 프로젝트에서 Spring Security 5.7.1 이상 또는 Spring Boot 2.7.0 이상을 사용하는 경우 IDE

“The type WebSecurityConfigurerAdapter is deprecated” 경고가 표시됩니다.

 

그렇다면 Spring SecurityWebSecurityConfigurerAdapter 의 사용을 더 이상 사용하지 않는 이유 대안에 대해서 알아보겠습니다.

 

 


 

 

-이유🤷🏻‍♀️ 

스프링 프레임워크 개발자들은 사용자가 컴포넌트 기반 보안 구성으로 이동하기를 권하기 때문입니니다.

 


-대안🙆🏻‍♂️

WebSecurityConfigurerAdapterextends 하고 HttpSecurity WebSecurity 오버라이딩 하는 대신

아래 방법과 같이 SecurityFilterChain WebSecurityCustomizer 유형의 두 빈을 선언 합니다.

@Configuration
public class SecurityConfiguration {
         
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
     
    }
     
    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
         
    }
         
}

 


-예시💻

security configuration 의 컴포넌트 기반 접근방식으로 바꾸는 코드 예제입니다.

 

 

 

먼저 아래와 같이 WebSecurityConfigurerAdapter 를 사용하는 일반적인 security configuration class 를 살펴보겠습니다 .

 

기존)

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Bean
    public UserDetailsService userDetailsService() {
        return new ShopmeUserDetailsService();
    }
 
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
     
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/login").permitAll()
                .antMatchers("/users/**", "/settings/**").hasAuthority("Admin")
                .hasAnyAuthority("Admin", "Editor", "Salesperson")
                .hasAnyAuthority("Admin", "Editor", "Salesperson", "Shipper")
                .anyRequest().authenticated()
                .and().formLogin()
                .loginPage("/login")
                    .usernameParameter("email")
                    .permitAll()
                .and()
                .rememberMe().key("AbcdEfghIjklmNopQrsTuvXyz_0123456789")
                .and()
                .logout().permitAll();
 
        http.headers().frameOptions().sameOrigin();
    }
     
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/images/**", "/js/**", "/webjars/**"); 
    }
}

 

 

 

 

그리고 아래 대안법은 WebSecurityConfigurerAdapter를 사용하지 않은 예시입니다.

 

대안법)

package net.codejava;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
 
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
 
    @Bean
    public UserDetailsService userDetailsService() {
        return new ShopmeUserDetailsService();
    }
 
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
 
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
     
        http.authorizeRequests().antMatchers("/login").permitAll()
                .antMatchers("/users/**", "/settings/**").hasAuthority("Admin")
                .hasAnyAuthority("Admin", "Editor", "Salesperson")
                .hasAnyAuthority("Admin", "Editor", "Salesperson", "Shipper")
                .anyRequest().authenticated()
                .and().formLogin()
                .loginPage("/login")
                    .usernameParameter("email")
                    .permitAll()
                .and()
                .rememberMe().key("AbcdEfghIjklmNopQrsTuvXyz_0123456789")
                .and()
                .logout().permitAll();
 
        http.headers().frameOptions().sameOrigin();
 
        return http.build();
    }
 
    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring().antMatchers("/images/**", "/js/**", "/webjars/**");
    }
 
}

 

해당 방법은 스프링 기반 애플리케이션의 스프링 시큐리티 사용에 있어서

“The type WebSecurityConfigurerAdapter is deprecated”경고를 지우는 방법입니다.

 

, WebSecurityConfigurerAdapter의 메스드 오버라이딩 정의 방법 대신 SecurityFilterChainWebSecurityCustomizer 빈들을 선언해야 합니다.

 

만약 코드를 변경하지 않고 유지 보수하기 위해서는 Spring Boot 버전을 2.7.0 미만으로 유지하거나 Spring Security 버전을 5.7.1 이전으로 유지해야 합니다.

 

참고 
https://www.codejava.net/frameworks/spring-boot/fix-websecurityconfigureradapter-deprecated

Spring Security - How to Fix WebSecurityConfigurerAdapter Deprecated

Written by  Nam Ha Minh

 

Spring Security - How to Fix WebSecurityConfigurerAdapter Deprecated

DetailsWritten by  Nam Ha Minh Last Updated on 01 June 2022   |   Print  Email In this short article, I’d like to share how to get rid of the warning saying that “The type WebSecurityConfigurerAdapter is deprecated” in Spring-based application w

www.codejava.net

 

'개발 > Spring Security' 카테고리의 다른 글

OAuth2.0- OAuth2.0의 이해  (0) 2022.06.29

+ Recent posts