diff --git a/src/main/java/cmf/commitField/domain/user/controller/AuthController.java b/src/main/java/cmf/commitField/domain/user/controller/AuthController.java index ccc326d..e6cc1c3 100644 --- a/src/main/java/cmf/commitField/domain/user/controller/AuthController.java +++ b/src/main/java/cmf/commitField/domain/user/controller/AuthController.java @@ -1,16 +1,26 @@ package cmf.commitField.domain.user.controller; -import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.Map; - @RestController public class AuthController { - @GetMapping("/user") - public Map user(@AuthenticationPrincipal OAuth2User principal) { - return principal.getAttributes(); // 사용자 정보 반환 + + @GetMapping("/login") + public ResponseEntity user() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication instanceof OAuth2AuthenticationToken) { + OAuth2User principal = (OAuth2User) authentication.getPrincipal(); + return ResponseEntity.ok(principal.getAttributes()); // 사용자 정보 반환 + } + + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("로그인이 필요합니다."); } -} +} \ No newline at end of file diff --git a/src/main/java/cmf/commitField/global/security/SecurityConfig.java b/src/main/java/cmf/commitField/global/security/SecurityConfig.java new file mode 100644 index 0000000..1b14d1f --- /dev/null +++ b/src/main/java/cmf/commitField/global/security/SecurityConfig.java @@ -0,0 +1,69 @@ +package cmf.commitField.global.security; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.user.OAuth2User; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +public class SecurityConfig { + @Bean + protected SecurityFilterChain config(HttpSecurity http) throws Exception { + + //로그인 관련 설정 + http + .oauth2Login(oauth2 -> oauth2 + .loginPage("/login") // 로그인 페이지 지정 + .successHandler((request, response, authentication) -> { + // 인증 정보가 SecurityContext에 추가되는 것을 보장 + SecurityContextHolder.getContext().setAuthentication(authentication); + + // 디버깅: authentication 정보 확인 + System.out.println("Authentication: " + authentication); + System.out.println("Principal: " + authentication.getPrincipal()); + + if (authentication != null && authentication.getPrincipal() != null) { + //인가가 있으면 유저 정보를 저장 + OAuth2User principal = (OAuth2User) authentication.getPrincipal(); + String username = principal.getAttribute("login"); + + // 세션에 사용자 정보를 추가 + request.getSession().setAttribute("user", username); + + response.sendRedirect("/"); // 로그인 성공 후 리다이렉트 + } else { + // 인증 실패 시 처리 + response.sendRedirect("/login?error=authenticationFailed"); + } + }) + ) + .sessionManagement(session -> session + .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) // 세션 정책 설정 + .invalidSessionUrl("/login?error=invalidSession") // 세션이 유효하지 않으면 이동할 URL + .maximumSessions(1) // 하나의 계정으로 한 번에 로그인할 수 있도록 제한 + .expiredUrl("/login?error=sessionExpired") // 세션 만료 후 이동할 URL 설정 + ); + + //로그아웃 관련 설정 + http + .logout(logout -> logout + .logoutUrl("/logout") // 로그아웃 URL 설정 + .logoutSuccessUrl("/") // 로그아웃 성공 후 이동할 URL + .invalidateHttpSession(true) // 로그아웃 시 세션 무효화 + .clearAuthentication(true) // 인증 정보 지우기 + .deleteCookies("JSESSIONID") // 세션 쿠키 삭제 + ); + http + .csrf( + AbstractHttpConfigurer::disable // CSRF 보호 비활성화 + ); + + return http.build(); + } +} \ No newline at end of file diff --git a/src/main/resources/static/favicon.ico b/src/main/resources/static/favicon.ico new file mode 100644 index 0000000..d7bc4a0 Binary files /dev/null and b/src/main/resources/static/favicon.ico differ diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html new file mode 100644 index 0000000..26d8df7 --- /dev/null +++ b/src/main/resources/static/index.html @@ -0,0 +1,47 @@ + + + + + + GitHub OAuth2 로그인 테스트 + + +

GitHub OAuth2 로그인 테스트

+ + + + + + + +

사용자 정보

+
로그인 후 정보를 불러옵니다...
+ + + +