-
Spring Security - OAuth 적용 개념도웹 개발/Spring Boot 2022. 1. 26. 16:25
[ Session 처리]
id/pw 로그인을 하며 UserDetails 타입으로 데이터가 들어오고
OAuth로 로그인을 하면 OAuth2User 타입으로 데이터가 들어옵니다.
이때,
Session에 등록할 때 이 두개 타입을 모두 상속 받은 PrincipalDetails를 만들고 그 안에 속성을 User(사용자 정보, 사용자 테이블)을 넣으면 됩니다.
또한, Session에 개발자 뭔가를 더 넣고 싶다면 어떻게 해야 할까요?User를 상속받고 추가로 속성을 만든 class를 만들면 될 것이라 추정됩니다.
아직 실습은 하지 않아서요...
public class MySessionInfo extends User { private String ssInfo1; private String ssInfo2; private String ssInfo3; }
PrincipalDetails에 MySessionInfo를 넣으면 될 것 같습니다.
// 테스트 메소드 영역 =========================================================================== @GetMapping("/test/login") public @ResponseBody String testLogin( Authentication authentication, @AuthenticationPrincipal PrincipalDetails principalDetails, // 표준적으로 이 방법을 가져오면 모든 데이터를 다 확인할 수 있음 @AuthenticationPrincipal UserDetails userDetails, @AuthenticationPrincipal OAuth2User oauth2usr) { PrincipalDetails authenticationPrincipalDetails = (PrincipalDetails) authentication.getPrincipal(); System.out.println("\n===========/test/login : authenticationPrincipalDetails ======================================="); System.out.println("authenticationPrincipalDetails : " + authenticationPrincipalDetails); System.out.println("authenticationPrincipalDetails.getUser() : " + authenticationPrincipalDetails.getUser()); // << 출력 결과 >> // authenticationPrincipalDetails : // PrincipalDetails( // user=User(id=18, // username=google_105569722421410314586, // password=$2a$10$xyqE5.K6neKSPZeKauQSdesWXXItRm0UmfgAXpFsWSi/AQ7Bh5XkC, // email=siseondev@gmail.com, // role=ROLE_USER, // provider=google, // providerId=105569722421410314586, // createDate=2022-01-25 09:36:29.401), // attributes={ // sub=105569722421410314586, // name=Dev SiSeon, // given_name=Dev, // family_name=SiSeon, // picture=https://lh3.googleusercontent.com/a/AATXAJzJEBX76MxuaszSr4Rnb6sb3IVabV9OkMD8abpx=s96-c, // email=siseondev@gmail.com, // email_verified=true, locale=ko}) // // authenticationPrincipalDetails.getUser() : // User(id=18, // username=google_105569722421410314586, // password=$2a$10$xyqE5.K6neKSPZeKauQSdesWXXItRm0UmfgAXpFsWSi/AQ7Bh5XkC, // email=siseondev@gmail.com, // role=ROLE_USER, // provider=google, // providerId=105569722421410314586, // createDate=2022-01-25 09:36:29.401) System.out.println("\n===========/test/login : principalDetails ======================================="); System.out.println("principalDetails : " + principalDetails); System.out.println("principalDetails.getUser() 내 DB에 저장한 것 : " + principalDetails.getUser()); System.out.println("principalDetails.getAttributes() 포털로 받은 것 : " + principalDetails.getAttributes()); System.out.println("getUser().getId() : " + principalDetails.getUser().getId()); System.out.println("getUser().getUsername() : " + principalDetails.getUser().getUsername()); System.out.println("getUser().getPassword() : " + principalDetails.getUser().getPassword()); System.out.println("getUser().getProvider() : " + principalDetails.getUser().getProvider()); System.out.println("getUser().getProviderId() : " + principalDetails.getUser().getProviderId()); System.out.println("getUser().getCreateDate() : " + principalDetails.getUser().getCreateDate()); // << 출력 결과 >> // principalDetails : // PrincipalDetails( // user=User( // principalDetails.getUser() 결과와 동일(내 DB에 저장한 것) // id=18, // username=google_105569722421410314586, // password=$2a$10$xyqE5.K6neKSPZeKauQSdesWXXItRm0UmfgAXpFsWSi/AQ7Bh5XkC, // email=siseondev@gmail.com, // role=ROLE_USER, // provider=google, // providerId=105569722421410314586, // createDate=2022-01-25 09:36:29.401), // attributes={ // principalDetails.getAttributes() 결과와 동일 (포털로 받은 것) // sub=105569722421410314586, // name=Dev SiSeon, // given_name=Dev, // family_name=SiSeon, // picture=https://lh3.googleusercontent.com/a/AATXAJzJEBX76MxuaszSr4Rnb6sb3IVabV9OkMD8abpx=s96-c, // email=siseondev@gmail.com, email_verified=true, locale=ko}) // principalDetails.getUser() : // User( // id=18, // username=google_105569722421410314586, // password=$2a$10$xyqE5.K6neKSPZeKauQSdesWXXItRm0UmfgAXpFsWSi/AQ7Bh5XkC, // email=siseondev@gmail.com, // role=ROLE_USER, // provider=google, // providerId=105569722421410314586, // createDate=2022-01-25 09:36:29.401) // getUser().getId() : 18 // getUser().getUsername() : google_105569722421410314586 // getUser().getPassword() : $2a$10$xyqE5.K6neKSPZeKauQSdesWXXItRm0UmfgAXpFsWSi/AQ7Bh5XkC // getUser().getProvider() : google // getUser().getProviderId() : 105569722421410314586 // getUser().getCreateDate() : 2022-01-25 09:36:29.401 System.out.println("\n===========/test/login : userDetails ======================================="); System.out.println("userDetails : " + userDetails); System.out.println("userDetails.getUsername() : " + userDetails.getUsername()); // << 출력 결과 >> // userDetails : // PrincipalDetails( // user=User( // id=18, // username=google_105569722421410314586, // password=$2a$10$xyqE5.K6neKSPZeKauQSdesWXXItRm0UmfgAXpFsWSi/AQ7Bh5XkC, // email=siseondev@gmail.com, // role=ROLE_USER, // provider=google, // providerId=105569722421410314586, // createDate=2022-01-25 09:36:29.401), // attributes={ // sub=105569722421410314586, // name=Dev SiSeon, // given_name=Dev, // family_name=SiSeon, // picture=https://lh3.googleusercontent.com/a/AATXAJzJEBX76MxuaszSr4Rnb6sb3IVabV9OkMD8abpx=s96-c, // email=siseondev@gmail.com, // email_verified=true, // locale=ko}) // userDetails.getUsername() : // google_105569722421410314586 System.out.println("\n===========/test/login : oauth2usr ======================================="); System.out.println("oauth2usr : " + oauth2usr); System.out.println("oauth2usr.getAttributes() : " + oauth2usr.getAttributes()); // << 출력 결과 >> // oauth2usr : // PrincipalDetails( // user=User( // id=18, // username=google_105569722421410314586, // password=$2a$10$xyqE5.K6neKSPZeKauQSdesWXXItRm0UmfgAXpFsWSi/AQ7Bh5XkC, // email=siseondev@gmail.com, role=ROLE_USER, // provider=google, providerId=105569722421410314586, // createDate=2022-01-25 09:36:29.401), // attributes={ // sub=105569722421410314586, // name=Dev SiSeon, // given_name=Dev, // family_name=SiSeon, // picture=https://lh3.googleusercontent.com/a/AATXAJzJEBX76MxuaszSr4Rnb6sb3IVabV9OkMD8abpx=s96-c, // email=siseondev@gmail.com, // email_verified=true, // locale=ko}) // oauth2usr.getAttributes() : // { // sub=105569722421410314586, // name=Dev SiSeon, // given_name=Dev, // family_name=SiSeon, // picture=https://lh3.googleusercontent.com/a/AATXAJzJEBX76MxuaszSr4Rnb6sb3IVabV9OkMD8abpx=s96-c, // email=siseondev@gmail.com, // email_verified=true, // locale=ko // } return "세션 정보 확인하기"; }
결론적으로 여러 방법이 있지만 @AuthenticationPrincipal PrincipalDetails principalDetails 이것을 통하여 모든 정보를 다시 읽어 활용할 수 있는 것이다.
principalDetails.getUser()은 나의 DB에 저장된 사용자 정보이고
System.out.println("principalDetails.getUser() 내 DB에 저장한 것 : " + principalDetails.getUser()); System.out.println("principalDetails.getUser().getId() : " + principalDetails.getUser().getId()); System.out.println("principalDetails.getUser().getUsername() : " + principalDetails.getUser().getUsername()); System.out.println("principalDetails.getUser().getPassword() : " + principalDetails.getUser().getPassword()); System.out.println("principalDetails.getUser().getProvider() : " + principalDetails.getUser().getProvider()); System.out.println("principalDetails.getUser().getProviderId() : " + principalDetails.getUser().getProviderId()); System.out.println("principalDetails.getUser().getCreateDate() : " + principalDetails.getUser().getCreateDate());
principalDetails.getAttributes()은 구글, 네이버 등에서 받은 정보가 된다.
Map<String, Object> 타입으로 받아 읽어야 함 System.out.println("principalDetails.getAttributes() 포털로 받은 것 : " + principalDetails.getAttributes()); System.out.println("principalDetails.getAttributes().get(\"sub\") : " + principalDetails.getAttributes().get("sub")); System.out.println("principalDetails.getAttributes().get(\"name\") : " + principalDetails.getAttributes().get("name")); System.out.println("principalDetails.getAttributes().get(\"given_name\") : " + principalDetails.getAttributes().get("given_name")); System.out.println("principalDetails.getAttributes().get(\"family_name\"): " + principalDetails.getAttributes().get("family_name")); System.out.println("principalDetails.getAttributes().get(\"picture\") : " + principalDetails.getAttributes().get("picture")); System.out.println("principalDetails.getAttributes().get(\"email\") : " + principalDetails.getAttributes().get("email"));