From e12558080ed572ef2dcfbed6a3019402a42aad88 Mon Sep 17 00:00:00 2001 From: whale22 Date: Thu, 20 Feb 2025 15:37:53 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20SecurityConfig.java=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/security/SecurityConfig.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/cmf/commitField/global/security/SecurityConfig.java 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..9d04d80 --- /dev/null +++ b/src/main/java/cmf/commitField/global/security/SecurityConfig.java @@ -0,0 +1,20 @@ +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.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +public class SecurityConfig { + @Bean + protected SecurityFilterChain config(HttpSecurity http) throws Exception { + http + .oauth2Login(oauth2 -> oauth2 + .loginPage("/login") // 로그인 페이지 지정 + ); + return http.build(); + } +} \ No newline at end of file From 9f6595a4c0863f5852c79086a145201c6aab4c37 Mon Sep 17 00:00:00 2001 From: whale22 Date: Thu, 20 Feb 2025 16:49:30 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20SecurityConfig=20=EB=82=B4=EC=9A=A9?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80,=20=EC=88=98=EC=A0=95,=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EB=82=B4=EC=9A=A9=20=EC=9D=BC?= =?UTF-8?q?=EB=B6=80=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20principal=EC=97=90?= =?UTF-8?q?=20=EC=A0=80=EC=9E=A5=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/AuthController.java | 24 ++++++--- .../global/security/SecurityConfig.java | 49 ++++++++++++++++++ src/main/resources/static/favicon.ico | Bin 0 -> 1150 bytes src/main/resources/static/index.html | 15 ++++-- 4 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 src/main/resources/static/favicon.ico 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 index 9d04d80..1b14d1f 100644 --- a/src/main/java/cmf/commitField/global/security/SecurityConfig.java +++ b/src/main/java/cmf/commitField/global/security/SecurityConfig.java @@ -4,6 +4,10 @@ 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 @@ -11,10 +15,55 @@ 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 0000000000000000000000000000000000000000..d7bc4a0f1a9b7c7ffa5fce3a32f3fbf67272d8db GIT binary patch literal 1150 zcmbVMOHWfl6dn_IZioxlF8v*Dd{D7zZA;XZEHp+U0;R33kQhu{fG!kbFs_VYK_r+y zZ|j4!#tLezl&Cb4)@md|X{{pk{dvw@hcuB8;xuQ@opa~BzVF-$v5S5!ErRy_;@oZ_ z_6Z>lkdTQix}B5|^ltASUF4ZIYru)NfE||5Ez7^_yo z;LY+!Bvw+0e9`Nu)$1tLDyY_LGFGAV6IW)&Bwo#!*uric@pa(_;m2z{6~@^76gH}5 zdFEQm)rx#Bme+70IwX5xt{H#E#7r1)%v2#O??niUJM)v!vNKpM6{StpF_-&?aSN(+5{e=LYFTKOcMnU@hB3_9cEU)KrD$*}!UhhNy9xQ)* zu~Kh5H-~9{cs|WR7tT&!$4GJlnc_DYt1~uCIP^*k)jX?OSaUz^B#JA29xu{d+M#`Z k3Hys%avnIBnWWiwt7pDv3wvM+IduN`TO*tLANXJW2T%s$>Hq)$ literal 0 HcmV?d00001 diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html index f09d09c..26d8df7 100644 --- a/src/main/resources/static/index.html +++ b/src/main/resources/static/index.html @@ -8,10 +8,12 @@

GitHub OAuth2 로그인 테스트

- + + +

사용자 정보

@@ -20,23 +22,26 @@

사용자 정보