Skip to content

Commit 88cbbe4

Browse files
authored
Merge pull request #15 from AI-Tutor-2024/security
[FIX] oauth session 문제 해결 시도
2 parents 24c2076 + 249b01a commit 88cbbe4

File tree

5 files changed

+42
-38
lines changed

5 files changed

+42
-38
lines changed

src/main/java/com/example/ai_tutor/global/config/security/SecurityConfig.java

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.example.ai_tutor.domain.auth.application.CustomDefaultOAuth2UserService;
44
import com.example.ai_tutor.domain.auth.application.CustomUserDetailsService;
55
import com.example.ai_tutor.domain.auth.domain.repository.CustomAuthorizationRequestRepository;
6+
import com.example.ai_tutor.global.config.security.auth.CustomOAuth2AuthorizationRequestRedirectFilter;
7+
import com.example.ai_tutor.global.config.security.auth.CustomOAuth2AuthorizationRequestResolver;
68
import com.example.ai_tutor.global.config.security.handler.CustomSimpleUrlAuthenticationFailureHandler;
79
import com.example.ai_tutor.global.config.security.handler.CustomSimpleUrlAuthenticationSuccessHandler;
810
import com.example.ai_tutor.global.config.security.token.CustomAuthenticationEntryPoint;
@@ -14,63 +16,48 @@
1416
import org.springframework.security.authentication.AuthenticationManager;
1517
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
1618
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
19+
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
1720
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
1821
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
1922
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
2023
import org.springframework.security.config.http.SessionCreationPolicy;
2124
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
2225
import org.springframework.security.crypto.password.PasswordEncoder;
26+
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter;
2327
import org.springframework.security.web.SecurityFilterChain;
2428
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
29+
import org.springframework.security.web.authentication.logout.LogoutFilter;
2530
import org.springframework.web.cors.CorsConfiguration;
2631
import org.springframework.web.cors.CorsConfigurationSource;
2732
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
2833

2934
import java.util.Arrays;
3035
import java.util.List;
3136

32-
@RequiredArgsConstructor
3337
@Configuration
38+
@RequiredArgsConstructor
3439
@EnableWebSecurity
40+
@EnableMethodSecurity
3541
public class SecurityConfig {
3642

3743
private final CustomUserDetailsService customUserDetailsService;
3844
private final CustomDefaultOAuth2UserService customOAuth2UserService;
3945
private final CustomSimpleUrlAuthenticationSuccessHandler oAuth2AuthenticationSuccessHandler;
4046
private final CustomSimpleUrlAuthenticationFailureHandler oAuth2AuthenticationFailureHandler;
4147
private final CustomAuthorizationRequestRepository customAuthorizationRequestRepository;
48+
private final CustomOAuth2AuthorizationRequestRedirectFilter customOAuth2AuthorizationRequestRedirectFilter;
49+
private final CustomOAuth2AuthorizationRequestResolver customOAuth2AuthorizationRequestResolver;
50+
private final JwtAuthenticationFilter jwtAuthenticationFilter;
4251

43-
@Bean
44-
public PasswordEncoder passwordEncoder() {
45-
return new BCryptPasswordEncoder();
46-
}
47-
48-
@Bean
49-
public JwtAuthenticationFilter customOncePerRequestFilter() {
50-
return new JwtAuthenticationFilter();
51-
}
52-
53-
@Bean
54-
public DaoAuthenticationProvider authenticationProvider() {
55-
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
56-
57-
authenticationProvider.setUserDetailsService(customUserDetailsService);
58-
authenticationProvider.setPasswordEncoder(passwordEncoder());
59-
60-
return authenticationProvider;
61-
}
62-
63-
@Bean
64-
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
65-
return authenticationConfiguration.getAuthenticationManager();
66-
}
6752

6853
@Bean
6954
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
7055
http
7156
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
7257
.csrf(AbstractHttpConfigurer::disable)
7358
.httpBasic(AbstractHttpConfigurer::disable)
59+
.addFilterBefore(customOAuth2AuthorizationRequestRedirectFilter, OAuth2AuthorizationRequestRedirectFilter.class)
60+
.addFilterBefore(jwtAuthenticationFilter, LogoutFilter.class)
7461
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
7562
.formLogin(AbstractHttpConfigurer::disable)
7663
.exceptionHandling(exception -> exception.authenticationEntryPoint(new CustomAuthenticationEntryPoint()))
@@ -88,15 +75,15 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
8875
.oauth2Login(oauth2 -> oauth2
8976
.authorizationEndpoint(authorization -> authorization
9077
.baseUri("/oauth2/authorize")
91-
.authorizationRequestRepository(customAuthorizationRequestRepository))
78+
.authorizationRequestRepository(customAuthorizationRequestRepository)
79+
.authorizationRequestResolver(customOAuth2AuthorizationRequestResolver))
9280
.redirectionEndpoint(redirection -> redirection
9381
.baseUri("/oauth2/callback/**"))
9482
.userInfoEndpoint(userInfo -> userInfo
9583
.userService(customOAuth2UserService))
9684
.successHandler(oAuth2AuthenticationSuccessHandler)
9785
.failureHandler(oAuth2AuthenticationFailureHandler));
9886

99-
http.addFilterBefore(customOncePerRequestFilter(), UsernamePasswordAuthenticationFilter.class);
10087
return http.build();
10188
}
10289

@@ -113,6 +100,24 @@ public CorsConfigurationSource corsConfigurationSource() {
113100
source.registerCorsConfiguration("/**", configuration);
114101
return source;
115102
}
103+
@Bean
104+
public PasswordEncoder passwordEncoder() {
105+
return new BCryptPasswordEncoder();
106+
}
107+
116108

109+
@Bean
110+
public DaoAuthenticationProvider authenticationProvider() {
111+
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
117112

113+
authenticationProvider.setUserDetailsService(customUserDetailsService);
114+
authenticationProvider.setPasswordEncoder(passwordEncoder());
115+
116+
return authenticationProvider;
117+
}
118+
119+
@Bean
120+
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
121+
return authenticationConfiguration.getAuthenticationManager();
122+
}
118123
}

src/main/java/com/example/ai_tutor/global/config/security/auth/CustomOAuth2AuthorizationRequestRedirectFilter.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.example.ai_tutor.global.config.security.auth;
22

3+
import com.example.ai_tutor.global.config.security.util.CustomCookie;
34
import jakarta.servlet.FilterChain;
45
import jakarta.servlet.ServletException;
56
import jakarta.servlet.http.HttpServletRequest;
@@ -24,13 +25,13 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
2425
String redirectUrl = request.getParameter("redirect_url");
2526
String errorRedirectUrl = request.getParameter("error_redirect_url");
2627

27-
// 쿼리 파라미터가 있다면 세션에 저장
28+
// 쿼리 파라미터가 있다면 쿠키에 저장
2829
if (redirectUrl != null) {
29-
request.getSession().setAttribute("OAUTH2_REDIRECT_URL", redirectUrl);
30+
CustomCookie.addCookie(response, "redirect_uri", redirectUrl, 180);
3031
}
3132

3233
if (errorRedirectUrl != null) {
33-
request.getSession().setAttribute("OAUTH2_ERROR_REDIRECT_URL", errorRedirectUrl);
34+
CustomCookie.addCookie(response, "error_redirect_uri", errorRedirectUrl, 180);
3435
}
3536

3637
// 기존 필터 체인 동작

src/main/java/com/example/ai_tutor/global/config/security/auth/CustomOAuth2AuthorizationRequestResolver.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@ public CustomOAuth2AuthorizationRequestResolver(ClientRegistrationRepository cli
1717
this.delegate = new DefaultOAuth2AuthorizationRequestResolver(clientRegistrationRepository, "/oauth2/authorize");
1818

1919
this.delegate.setAuthorizationRequestCustomizer(builder -> {
20-
String registrationId = (String) builder.build().getAttributes().get("registration_id");
21-
if ("google".equals(registrationId)) {
22-
builder.additionalParameters(params -> params.put("prompt", "select_account"));
23-
}
20+
builder.additionalParameters(params -> params.put("prompt", "consent"));
2421
});
2522
}
2623

src/main/java/com/example/ai_tutor/global/config/security/handler/CustomSimpleUrlAuthenticationSuccessHandler.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
import com.example.ai_tutor.domain.auth.domain.repository.CustomAuthorizationRequestRepository;
66
import com.example.ai_tutor.domain.auth.domain.repository.TokenRepository;
77
import com.example.ai_tutor.domain.auth.dto.TokenMapping;
8-
import com.example.ai_tutor.global.DefaultAssert;
9-
import com.example.ai_tutor.global.config.security.OAuth2Config;
108
import com.example.ai_tutor.global.config.security.util.CustomCookie;
119
import jakarta.servlet.ServletException;
1210
import jakarta.servlet.http.Cookie;

src/main/java/com/example/ai_tutor/global/config/security/token/JwtAuthenticationFilter.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,24 @@
55
import jakarta.servlet.ServletException;
66
import jakarta.servlet.http.HttpServletRequest;
77
import jakarta.servlet.http.HttpServletResponse;
8+
import lombok.RequiredArgsConstructor;
89
import lombok.extern.slf4j.Slf4j;
910
import org.springframework.beans.factory.annotation.Autowired;
1011
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
1112
import org.springframework.security.core.context.SecurityContextHolder;
1213
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
14+
import org.springframework.stereotype.Component;
1315
import org.springframework.util.StringUtils;
1416
import org.springframework.web.filter.OncePerRequestFilter;
1517

1618
import java.io.IOException;
1719

1820
@Slf4j
21+
@Component
22+
@RequiredArgsConstructor
1923
public class JwtAuthenticationFilter extends OncePerRequestFilter {
2024

21-
@Autowired
22-
private JwtUtil jwtUtil;
25+
private final JwtUtil jwtUtil;
2326

2427
public static final String AUTHORIZATION_HEADER_NAME = "Authorization";
2528
public static final String BEARER_TOKEN_PREFIX = "Bearer ";

0 commit comments

Comments
 (0)