Spring/스프링 이론

WebSecurityConfigurerAdapter deprecated 대체하는 방법

블로그 주인장 2023. 12. 8.


WebSecurityConfigurerAdapter 대체

WebSecurityConfigurerAdapter Not Importing

 

Spring Security 6.0 버전을 기준으로 WebSecurityConfigurerAdapter를 import를 하지 못한다.

WebSecurityConfigurerAdapter를 대체하는 방법에 대해 알아보겠습니다.


커스텀 컴포넌트 설정 방법


configure(httpSecurity 설정)

  1. 기존 방식의 코드
    @Configuration 
    @EnableWebSecurity
    public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
     
       @Override 
       protected void configure(HttpSecurity http) throws Exception { 
         http.cors().and().csrf().disable()
             .and().authorizeRequests() 
             .antMatchers("/home").permitAll()
             .antMatchers("/mypage").authenticated()
             .anyRequest().authenticated()
         ; 
       }
    }
  2. 변경한 코드
    @Configuration 
    @EnableWebSecurity
    public class WebSecurityConfiguration {
     
       @Bean
       public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { 
            http.cors().and().csrf().disable()
             .and().authorizeRequests() 
                .antMatchers("/home").permitAll()
                .antMatchers("/mypage").authenticated()
                .anyRequest().authenticated()
          return http.build();
       }
    }
  • 설명
    • WebSecurityConfigurerAdapter를 제거한 코드에서는 @Bean 어노테이션을 이용하여 등록해야한다.
    • HttpSecurity 자체를 변경할 필요는 없다.
    • 주의할 점은 메서드 이름을 configure -> filterChain 으로 변경해야한다.

.

AuthenticationManager

  1. 기존 방식의 코드
    @Configuration 
    @EnableWebSecurity
    public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
     
        @Autowired
        UserDetailsService userDetailsService;
     
        @Override
        public void configure(
            AuthenticationManagerBuilder authenticationManagerBuilder) 
                                                            throws Exception {
     
            authenticationManagerBuilder.userDetailsService(userDetailsService)
                                        .passwordEncoder(passwordEncoder());
        }
     
        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    }​
  2. 변경한 코드
    @Configuration 
    @EnableWebSecurity
    public class WebSecurityConfiguration {
     
        @Bean
        AuthenticationManager authenticationManager(
                AuthenticationConfiguration authenticationConfiguration) throws Exception {
            return authenticationConfiguration.getAuthenticationManager();
        }
    
    }​
  • 설명
    • 스프링 시큐리티의 인증을 담당하는 AuthenticationManger는 AuthenticationManagerBuilder를 이용해서 userDetailsService와 passwordEncoder를 설정해야한다.
    • 변경된 방식에서는 AuthenticationManager Bean 생성 시 스프링 내부 동작으로 인해 userDetailsService와 passwordEncoder가 자동 설정된다.

 

web.ignoring

  1. 기존 방식의 코드
    @EnableWebSecurity
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
     
        @Override
        public void configure(WebSecurity web) {
            web.ignoring().antMatchers("/ignore1", "/ignore2");
        }
    }​
  2. 변경한 코드
    @EnableWebSecurity
    public class SecurityConfiguration {
     
        @Bean
        public WebSecurityCustomizer webSecurityCustomizer() {
            return (web) -> web.ignoring().antMatchers("/ignore1", "/ignore2");
        }
    }​​
  • 설명
    • WebSecurity를 커스텀할 때 WebSecurityCustomizer 인터페이스를 사용한다.
    • "/ignore1", "/ignore2" 요청에 대해서는 스프링 시큐리티를 적용하지 않는다.
    • webSecurityCustomizer 메서드를 @Bean 처리를 한다.

 

In-Memory Authentication 설정

  1. 기존 방식의 코드
    @Configuration
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(AuthenticationManagerBuilder auth) 
                                                    throws Exception {
            UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("ADMIN")
                .build();
                
            auth.inMemoryAuthentication().withUser(user);
        }
    }​
  2. 변경한 코드
    @Configuration
    public class SecurityConfiguration {
    
        @Bean
        public InMemoryUserDetailsManager userDetailsService() {
            UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("ADMIN")
                .build();
                
            return new InMemoryUserDetailsManager(user);
        }
    }
  • 설명
    • userDetailsService를 Bean 이름으로 하며 InMemoryUserDetailsManager 변환값을 갖는 빈을 설정한다.

 

참고 자료


 

Spring Security without the WebSecurityConfigurerAdapter

In Spring Security 5.7.0-M2 we deprecated the WebSecurityConfigurerAdapter, as we encourage users to move towards a component-based security configuration. To assist with the transition to this new style of configuration, we have compiled a list of common

spring.io

 

Spring Security — H2 Database -Without WebSecurityConfigurerAdapter

In spring security 5.7 version, “WebSecurityConfigurerAdapter” deprecated.

medium.com

반응형

댓글