1111import org .springframework .security .config .annotation .web .configuration .EnableWebSecurity ;
1212import org .springframework .security .config .http .SessionCreationPolicy ;
1313import org .springframework .security .crypto .bcrypt .BCryptPasswordEncoder ;
14+ import org .springframework .security .oauth2 .client .web .AuthorizationRequestRepository ;
15+ import org .springframework .security .oauth2 .core .endpoint .OAuth2AuthorizationRequest ;
16+ import org .springframework .security .web .AuthenticationEntryPoint ;
1417import org .springframework .security .web .SecurityFilterChain ;
18+ import org .springframework .security .web .authentication .DelegatingAuthenticationEntryPoint ;
19+ import org .springframework .security .web .authentication .Http403ForbiddenEntryPoint ;
1520import org .springframework .security .web .authentication .UsernamePasswordAuthenticationFilter ;
1621import org .springframework .security .web .authentication .logout .LogoutFilter ;
22+ import org .springframework .security .web .util .matcher .AntPathRequestMatcher ;
23+ import org .springframework .security .web .util .matcher .RequestMatcher ;
1724import org .springframework .web .cors .CorsConfiguration ;
1825import org .springframework .web .cors .CorsConfigurationSource ;
1926import sequence .sequence_member .member .authority .OAuth2FailureHandler ;
2229import sequence .sequence_member .member .jwt .JWTFilter ;
2330import sequence .sequence_member .member .jwt .JWTUtil ;
2431import sequence .sequence_member .member .jwt .LoginFilter ;
32+ import sequence .sequence_member .member .repository .CustomAuthorizationRequestRepository ;
2533import sequence .sequence_member .member .repository .MemberRepository ;
2634import sequence .sequence_member .member .repository .RefreshRepository ;
27- import sequence .sequence_member .member .service .CustomOAuth2UserService ;
35+ import sequence .sequence_member .member .service .CustomOidcUserService ;
2836import sequence .sequence_member .member .service .TokenReissueService ;
2937
3038import java .util .Arrays ;
3139import java .util .Collections ;
40+ import java .util .LinkedHashMap ;
3241
3342@ Configuration
3443@ EnableWebSecurity
@@ -43,7 +52,7 @@ public class SecurityConfig {
4352 private final MemberRepository memberRepository ;
4453 private final OAuth2FailureHandler oAuth2FailureHandler ;
4554 private final OAuth2SuccessHandler oAuth2SuccessHandler ;
46- private final CustomOAuth2UserService customOAuth2UserService ;
55+ private final CustomOidcUserService customOidcUserService ;
4756
4857 @ Bean
4958 public AuthenticationManager authenticationManager (AuthenticationConfiguration configuration ) throws Exception {
@@ -55,6 +64,11 @@ public BCryptPasswordEncoder bCryptPasswordEncoder(){
5564 return new BCryptPasswordEncoder ();
5665 }
5766
67+ @ Bean
68+ public AuthorizationRequestRepository <OAuth2AuthorizationRequest > authorizationRequestRepository () {
69+ return new CustomAuthorizationRequestRepository ();
70+ }
71+
5872 @ Bean
5973 public SecurityFilterChain filterChain (HttpSecurity http ) throws Exception {
6074 // Custom LoginFilter 등록
@@ -100,24 +114,54 @@ public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
100114 //경로별 인가 작업
101115 http
102116 .authorizeHttpRequests ((auth )->auth
103- .requestMatchers ("/api/login" , "/api/users/join" , "/api/token" , "/api/users/check_username" , "/api/users/check_email" , "/api/users/check_nickname" , "/api/skills/**" , "/api/users/test" , "/api/auth/**" ).permitAll ()
117+ // 인증이 필요 없는 경로들을 먼저 정의합니다.
118+ .requestMatchers (
119+ "/api/login" ,
120+ "/api/users/join" ,
121+ "/api/token" ,
122+ "/api/users/check_username" ,
123+ "/api/users/check_email" ,
124+ "/api/users/check_nickname" ,
125+ "/api/skills/**" ,
126+ "/api/users/test" ,
127+ "/api/auth/**" ,
128+ "/error" ,
129+ "/actuator/**" ,
130+ "/oauth2/**" ,
131+ "/login/oauth2/code/**" ,
132+ "/favicon.ico" ,
133+ "/.well-known/**" ,
134+ "/"
135+ ).permitAll ()
104136 .requestMatchers (HttpMethod .GET ,"/api/projects/**" ).permitAll ()
105137 .requestMatchers (HttpMethod .GET , "/api/archive/projects/**" ).permitAll ()
106138 .requestMatchers (HttpMethod .GET , "/api/archive/{archiveId}" ).permitAll ()
107- .requestMatchers ("/api/archive/**" ).authenticated ()
108- .requestMatchers ("/error" ).permitAll ()
109- .requestMatchers ("/actuator/**" ).permitAll ()
110- .requestMatchers ("/oauth2/**" ).permitAll ()
111- .anyRequest ().authenticated ());
139+ .requestMatchers ("/api/archive/**" ).authenticated () // 인증 필요
140+ .anyRequest ().authenticated ()); // 나머지 모든 요청은 인증 필요
112141 http
113142 .oauth2Login (oauth2 -> oauth2
143+ .authorizationEndpoint (authEndpoint -> authEndpoint
144+ .authorizationRequestRepository (authorizationRequestRepository ())
145+ )
114146 .userInfoEndpoint (userInfo -> userInfo
115- .userService ( customOAuth2UserService )
147+ .oidcUserService ( customOidcUserService )
116148 )
117149 .successHandler (oAuth2SuccessHandler )
118150 .failureHandler (oAuth2FailureHandler )
119151 );
120152
153+ LinkedHashMap <RequestMatcher , AuthenticationEntryPoint > entryPoints = new LinkedHashMap <>();
154+ entryPoints .put (new AntPathRequestMatcher ("/oauth2/authorization/**" ), new Http403ForbiddenEntryPoint ());
155+ entryPoints .put (new AntPathRequestMatcher ("/favicon.ico" ), new Http403ForbiddenEntryPoint ());
156+ entryPoints .put (new AntPathRequestMatcher ("/.well-known/**" ), new Http403ForbiddenEntryPoint ());
157+
158+ http
159+ .exceptionHandling (exceptionHandling -> {
160+ DelegatingAuthenticationEntryPoint delegatingEntryPoint = new DelegatingAuthenticationEntryPoint (entryPoints );
161+ delegatingEntryPoint .setDefaultEntryPoint (new Http403ForbiddenEntryPoint ()); // 기본 엔트리포인트 명시적으로 설정
162+ exceptionHandling .authenticationEntryPoint (delegatingEntryPoint );
163+ });
164+
121165 http
122166 .addFilterBefore (new JWTFilter (jwtUtil ), LoginFilter .class );
123167
0 commit comments