각진 세상에 둥근 춤을 추자
[Spring Boot] WebSecurityConfigurerAdapter 지원 중단 본문
이전 글 참고
[Spring Boot] Spring Security 회원 등록 (인증, 인가) + BCryptPasswordEncoder
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();
}
}
'Spring' 카테고리의 다른 글
[Spring Boot] 네이버 검색 API를 이용한 책 목록 조회 (2) | 2023.01.18 |
---|---|
[Spring Boot] REST 웹 서비스 + 실습 (0) | 2023.01.17 |
[Spring Boot] Spring Security 회원 등록 (인증, 인가) + BCryptPasswordEncoder (1) | 2023.01.13 |
[Spring Boot] Spring Security 처리 과정 + 로그인 예제 (인증, 인가) (0) | 2023.01.12 |
[Spring Boot] JPA 사용 - 간단 회원 정보 입력, 목록, 수정, 삭제 (0) | 2023.01.11 |