각진 세상에 둥근 춤을 추자

[Spring Boot] WebSecurityConfigurerAdapter 지원 중단 본문

Spring

[Spring Boot] WebSecurityConfigurerAdapter 지원 중단

circle.j 2023. 1. 16. 19:12

이전 글 참고

[Spring Boot] Spring Security 회원 등록 (인증, 인가) + BCryptPasswordEncoder

 

[Spring Boot] Spring Security 회원 등록 (인증, 인가) + BCryptPasswordEncoder

이전 글에 이어서 [Spring Boot] Spring Security 처리 과정 + 로그인 예제 (인증, 인가) [Spring Boot] Spring Security 처리 과정 + 로그인 예제 (인증, 인가) 인증(Authentication)과 인가(Authorization) 인증(Authentication):

this-circle-jeong.tistory.com

 

SecurityConfig.java에서 WebSecurityConfigurerAdapter을 상속받아 인가 기능을 구현하였다.

코드를 작성한 화면을 보면 WebSecurityConfigurerAdapter에 줄이 그어져 있다.

spring security 5.7이상에서 더 이상 WebSecurityConfigurerAdapter 사용을 권장하지 않는다고 한다.

 

SecurityFilterChain Bean 등록을 통해 해결한다.

 

 


 

[변경 전: SecurityConfig.java]

 

package kr.co.ch08.security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
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.MessageDigestPasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    // WebSecurityConfigurerAdapter 상속 받아서 하는 씨큐리티 설정은 Deprecated 됨 -> filterChain 방식 권장
    @Override
    protected void configure(HttpSecurity http) throws Exception {
		
    // 인가(접근권한) 설정 (index : 모든 링크(사용자)에 대해 허용을 해 준 상태, 권한관리필터)
    http.authorizeHttpRequests().antMatchers("/").permitAll();
    // admin 하위의 모든 자원 -> "ADMIN"에게 부여
    http.authorizeHttpRequests().antMatchers("/admin/**").hasRole("ADMIN");
    // member 하위의 모든 자원 -> "ADMIN", "MEMBER" 에게 부여
    http.authorizeHttpRequests().antMatchers("/member/**").hasAnyRole("ADMIN", "MEMBER");
    // GUEST는 무권한 -> 생략
    // loginSuccess 접근 -> "ADMIN"만 접근 허용
    http.authorizeHttpRequests().antMatchers("/user2/loginSuccess").hasAnyRole("3", "4", "5");

    // 사이트 위변조 요청 방지
    http.csrf().disable();

    // 로그인 설정
    http.formLogin()
    .loginPage("/user2/login")
    .defaultSuccessUrl("/user2/loginSuccess")
    .failureUrl("/user2/login?success=100")
    .usernameParameter("uid")
    .passwordParameter("pass");

    // 로그아웃 설정
    http.logout()
    .invalidateHttpSession(true)
    .logoutRequestMatcher(new AntPathRequestMatcher("/user2/logout"))
    .logoutSuccessUrl("/user2/login?success=200");
	}
	
	@Autowired
	private SecurityUserService service;
	
	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		// 로그인 인증처리 서비스 등록 (기본 SHA2)
		//auth.userDetailsService(service).passwordEncoder(new MessageDigestPasswordEncoder("SHA-256"));
		
		// 로그인 인증처리 서비스 등록 (BcryptPassword)
		auth.userDetailsService(service).passwordEncoder(new BCryptPasswordEncoder());
	}
	
}

 

[변경 후: SecurityConfigration.java]

 

package kr.co.ch08.security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

@Configuration
public class SecurityConfigration {
    @Autowired
    private SecurityUserService service;
	
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
		
    // 인가(접근권한) 설정
    http.authorizeHttpRequests().antMatchers("/").permitAll();
    http.authorizeHttpRequests().antMatchers("/admin/**").hasRole("ADMIN"); 
    http.authorizeHttpRequests().antMatchers("/member/**").hasAnyRole("ADMIN", "MEMBER");
    http.authorizeHttpRequests().antMatchers("/user2/loginSuccess").hasAnyRole("3", "4", "5");
		
    // 사이트 위변조 요청 방지
    http.csrf().disable();

    // 로그인 설정
    http.formLogin()
    .loginPage("/user2/login")
    .defaultSuccessUrl("/user2/loginSuccess")
    .failureUrl("/user2/login?success=100)")
    .usernameParameter("uid")
    .passwordParameter("pass");
		
    // 로그아웃 설정
    http.logout()
    .invalidateHttpSession(true)
    .logoutRequestMatcher(new AntPathRequestMatcher("/user2/logout"))
    .logoutSuccessUrl("/user2/login?success=200");

    // 사용자 인증 처리 컴포넌트 서비스 등록
    http.userDetailsService(service);

    return http.build();
}
	
    @Bean
    public PasswordEncoder PasswordEncoder () {
    	//return new MessageDigestPasswordEncoder("SHA-256");
    	return new BCryptPasswordEncoder();
    }
}