스프링애플리케이션에서 스프링 시큐리티를 사용할 때
“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 Security가 WebSecurityConfigurerAdapter 의 사용을 더 이상 사용하지 않는 이유와 대안에 대해서 알아보겠습니다.
-이유🤷🏻♀️
스프링 프레임워크 개발자들은 사용자가 컴포넌트 기반 보안 구성으로 이동하기를 권하기 때문입니니다.
-대안🙆🏻♂️
WebSecurityConfigurerAdapter를 extends 하고 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의 메스드 오버라이딩 정의 방법 대신 SecurityFilterChain과 WebSecurityCustomizer 빈들을 선언해야 합니다.
만약 코드를 변경하지 않고 유지 보수하기 위해서는 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' 카테고리의 다른 글
OAuth2.0- OAuth2.0의 이해 (0) | 2022.06.29 |
---|