우선 로그인 버튼을 구현을 하려면 프론트를 만져야만 한다.
리소스 파일 안에 templates를 만들고, 그 안에 index.html을 만든다.
@Configuration
@EnableWebSecurity
class SecurityConfig(
private val jwtAuthenticationFilter: JwtAuthenticationFilter, // JwtAuthenticationFilter 의존성 주입
private val authenticationEntryPoint: AuthenticationEntryPoint,
private val accessDeniedHandler: AccessDeniedHandler
) {
@Bean
fun filterChain(http: HttpSecurity): SecurityFilterChain {
return http
.httpBasic { it.disable() }
.formLogin { it.disable() }
.csrf { it.disable() }
.headers { it.frameOptions { options -> options.sameOrigin() } } // H2 Console을 위한 설정
.authorizeHttpRequests {
it.requestMatchers(
"/login", "/signup", "/swagger-ui/**", "/v3/api-docs/**"
).permitAll()
.anyRequest().authenticated()
}
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter::class.java) // JWT 필터 추가
.exceptionHandling {
it.authenticationEntryPoint(authenticationEntryPoint)
it.accessDeniedHandler(accessDeniedHandler)
}
.sessionManagement {
it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 세션 상태를 Stateless로 설정
}
.build()
}
}
그런데 이것만으론 소셜로그인이 안된다고 한다.
그래서
@Configuration
@EnableWebSecurity
class SecurityConfig(
private val jwtAuthenticationFilter: JwtAuthenticationFilter, // JwtAuthenticationFilter 의존성 주입
private val authenticationEntryPoint: AuthenticationEntryPoint,
private val accessDeniedHandler: AccessDeniedHandler,
private val oAuth2UserService: OAuth2UserService,
private val oAuth2LoginSuccessHandler: OAuth2LoginSuccessHandler,
) {
@Bean
fun filterChain(http: HttpSecurity): SecurityFilterChain {
return http
.httpBasic { it.disable() }
.formLogin { it.disable() }
.csrf { it.disable() }
.headers { it.frameOptions { options -> options.sameOrigin() } } // H2 Console을 위한 설정
.authorizeHttpRequests {
it.requestMatchers(
"/login", "/signup", "/swagger-ui/**", "/v3/api-docs/**", "/oauth2/login",
"/oauth2/callback/**",
).permitAll()
.anyRequest().authenticated()
}
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter::class.java)
.exceptionHandling {
it.authenticationEntryPoint(authenticationEntryPoint)
it.accessDeniedHandler(accessDeniedHandler)
}
.oauth2Login { oauthConfig ->
oauthConfig.authorizationEndpoint {
it.baseUri("/oauth2/login")
}.redirectionEndpoint {
it.baseUri("/oauth2/callback/*")
}.userInfoEndpoint {
it.userService(oAuth2UserService)
}.successHandler(oAuth2LoginSuccessHandler)
}
.sessionManagement {
it.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
}
.build()
}
}
이렇게 oAuth2UserService, OAuth2LoginSuccessHandler와 연결시키고
.oauth2Login { oauthConfig ->
oauthConfig.authorizationEndpoint {
it.baseUri("/oauth2/login")
}.redirectionEndpoint {
it.baseUri("/oauth2/callback/*")
}.userInfoEndpoint {
it.userService(oAuth2UserService)
}.successHandler(oAuth2LoginSuccessHandler)
} 를 추가해 오어스와 욘굘시킨다.
그런대, 그러자
Parameter 0 of method setFilterChains in org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration required a bean of type 'org.springframework.security.oauth2.client.registration.ClientRegistrationRepository' that could not be found.
Action:
Consider defining a bean of type 'org.springframework.security.oauth2.client.registration.ClientRegistrationRepository' in your configuration.
이건 물어본 결과,
, ClientRegistrationRepository 타입의 빈이 필요하지만, 찾을 수 없다고 합니다. 이는 Spring Security가 OAuth2 클라이언트 등록 정보를 관리하기 위해 ClientRegistrationRepository 인터페이스의 구현체를 요구하는데, 이에 해당하는 설정이 Spring Application Context에 존재하지 않음을 의미합니다.
이 문제는 일반적으로 spring-boot-starter-oauth2-client 의존성이 프로젝트에 포함되어 있지 않거나, 올바르게 설정되지 않았을 때 발생할 수 있습니다.
그래서 해결책을 찾는 중이다.