스프링부트 3.x버전과 자바 17을 사용하여 스프링부트 시큐리티 관련 코드를 작성 중이었습니다.
그런데 평소처럼 코드를 사용하던 차에 이런 오류가 발생했습니다.
(??? 대체 내가 뭘 잘못했다고..)
기존에는 이렇게 써도 문제가 없었고, http.csrf().disable()로 csrf를 비활성화하는 방식이었는데, 스프링부트 2.x버전이 문제라고 생각해서 직접 알아봤습니다.
공식 문서 및 깃허브에 접근해서 확인해본 결과, 버전업이 되며 코드 스타일이 달라진 것이 확연하게 보였습니다.
따라서 저 또한 다음과 같이 코드를 변경해주었습니다.
스프링부트 2.x
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/user/****").authenticated()
.antMatchers("/admin/****").access("hasRole('ROLE_ADMIN')")
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/loginProc")
.defaultSuccessUrl("/")
.and()
.oauth2Login()
.loginPage("/login")
.userInfoEndpoint()
.userService(principalOauth2UserService);
return http.build();
}
스프링부트 3.x
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http.
csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests((authorizeRequests) ->
authorizeRequests
.requestMatchers("/user/****").authenticated()
.requestMatchers("/admin/****").hasRole("ROLE_ADMIN")
.anyRequest().permitAll()
)
.formLogin(login -> login
.loginPage("/login")
.loginProcessingUrl("/loginProc")
.defaultSuccessUrl("/")
)
.oauth2Login(oauth2Configurer -> oauth2Configurer
.loginPage("/login")
.userInfoEndpoint(userInfo ->
userInfo.userService(principalOauth2UserService))
)
.getOrBuild();
}
이전처럼 and()로 chaining이 되지 않아 코드가 기능별로 분류가 잘 된 것이 눈에 확연이 띄는 것이 장점이라고 생각합니다.
몇 가지 명칭이 변경된 점이 있습니다.
authorizeRequests -> authorizeHttpRequests
antMatchers -> requestMatchers
build -> getOrBuild