책의 예제를 참고해서 Oauth 구글 로그인을 하기 위해 SecurityConfig 파일을 작성하는데
스프링 3.1.x 버전에서 많은 메서드들이 deprecated 되었다.
문제를 해결하려고 구글링 했는데 대부분 블로그 글이 이전 버전 자료여서 알맞게 수정하는데 시간이 꽤 걸렸다...
@RequiredArgsConstructor
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final CustomOAuth2UserService customOAuth2UserService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.headers().frameOptions().disable()
.and()
.authorizeRequests()
.antMatchers("/", "/css/**", "/images/**", "/js/**", "/h2-console/**", "/profile").permitAll()
.antMatchers("/api/v1/**").hasRole(Role.USER.name())
.anyRequest().authenticated()
.and()
.logout()
.logoutSuccessUrl("/")
.and()
.oauth2Login()
.userInfoEndpoint()
.userService(customOAuth2UserService);
}
}
@Configuration
@RequiredArgsConstructor
@EnableWebSecurity
public class SecurityConfig {
private final CustomOAuth2UserService customOAuth2UserService;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf((csrf) -> csrf.disable())
.headers((headerConfig) ->
headerConfig.frameOptions(frameOptionsConfig ->
frameOptionsConfig.disable()
))
.authorizeRequests((authorizeRequests) ->
authorizeRequests
.requestMatchers("/","/oauth2/authorization/google", "/api/brands/**", "/api/products/**").permitAll()
.requestMatchers("/admin/**").hasRole(Role.ADMIN.name())
.requestMatchers("/api/buying/**", "/api/selling/**", "api/buy/**", "api/sell/**").hasRole(Role.USER.name())
.anyRequest().authenticated()
)
.logout((logoutConfig) ->
logoutConfig.logoutSuccessUrl("/")
)
.oauth2Login((oauth2) -> oauth2
.loginPage("/oauth2/authorization/google") // 권한 접근 실패 시 로그인 페이지로 이동
.defaultSuccessUrl("http://localhost:3000") // 로그인 성공 시 이동할 페이지
.failureUrl("/oauth2/authorization/google") // 로그인 실패 시 이동 페이지
.userInfoEndpoint(userInfoEndpoint -> userInfoEndpoint
.userService(customOAuth2UserService)));
return http.build();
}
}
https://docs.spring.io/spring-security/reference/servlet/authorization/authorize-http-requests.html
https://docs.spring.io/spring-security/site/docs/current/api/deprecated-list.html
https://spring.io/blog/2019/11/21/spring-security-lambda-dsl
and()
로 옵션들을 이어줄 필요가 없어졌다. oauth2Login
말고 formLogin
을 썼는데, Oauth2
기반으로 로그인을 할 땐 oauth2Login를 써야 한다고 한다(당연함)스프링 시큐리티를 완전히 이해하지 못하고 주먹구구식으로 코드를 짜려고 하다 보니 쓸데없는 시간이 너무 많이 걸리고 막막했다...
스프링 시큐리티 어렵다•••