일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 웹개발자
- React
- 프론트엔드
- spring
- JavaScript
- 스프링부트
- 수제비
- security
- 정보처리기사 실기
- useState
- 타입스크립트
- TypeScript
- JWT
- Front-End
- Node.js
- TS
- It
- 자바스크립트
- JS
- 정보처리기사
- 백엔드
- 리액트
- spring boot
- spring boot security
- 큐넷
- frontend
- VUE
- Authentication
- Redux
- 백엔드개발자
- Today
- Total
솔적솔적
Spring Boot Security - Authentication 객체가 가질 수 있는 2가지 타입 본문
Spring Boot Security - Authentication 객체가 가질 수 있는 2가지 타입
솔솔봄향기 2022. 2. 9. 10:01getClientRegistration 에는 서버에 기본 정보들이 들어있다.
어떤 OAuth로 로그인 했는지 확인한다.
구글로그인 버튼 클릭을 하면 구글로그인창 나오고
로그인완료 하면 code를 리턴(OAuth-Client라이브러리) => Access Token요청
이 userRequest정보로 뭘해야하냐면
회원프로필 정보를 받아야함(loadUser 함수호출) -> 구글 회원프로필 받아준다.
PrincipalOauth2UserService
@Service
public class PrincipalOauth2UserService extends DefaultOAuth2UserService {
//구글로 부터 받은 userRequest데이터에 대한 후처리 되는 함수
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
System.out.println("getClientRegistration:"+userRequest.getClientRegistration());
System.out.println("getAccessToken:"+userRequest.getAccessToken().getTokenValue());
System.out.println("getAttributes:"+super.loadUser(userRequest).getAttributes());
//받은 getAttributes 정보로 강제 회원가입을 시킬 것이다.
OAuth2User oauth2User = super.loadUser(userRequest);
return super.loadUser(userRequest);
}
}
IndexController.java
@GetMapping("/test/login")
public @ResponseBody String testLogin(Authentication authentication,
@AuthenticationPrincipal PrincipalDetails userDetails) { //DI 의존성 주입
System.out.println("/test/login=========");
PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal();
System.out.println("authentication:"+principalDetails.getUser());
System.out.println("userDetails:"+userDetails.getUser());
return "세션 정보 확인하기";
}
@GetMapping("/test/login")
public @ResponseBody String testLogin(Authentication authentication,
@AuthenticationPrincipal PrincipalDetails userDetails) { //DI 의존성 주입
System.out.println("/test/login=========");
PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal();
System.out.println("authentication:"+principalDetails.getUser());
System.out.println("userDetails:"+userDetails.getUser());
return "세션 정보 확인하기";
}
@GetMapping("/test/oauth/login")
public @ResponseBody String testOAuthLogin(
Authentication authentication){ //DI 의존성 주입
System.out.println("/test/login=========");
OAuth2User oauth2User = (OAuth2User) authentication.getPrincipal();
System.out.println("authentication:"+oauth2User.getAttributes());
return "OAuth 세션 정보 확인하기";
}
세션안에 시큐리티가 관리하는 세션이 있고 Authentication 있어야한다.
이 Authentication 안에 들어갈 수 있는 두개의 타입이 있는데,
UserDetails와 OAuth2User타입이 들어갈 수 있다.
시큐리티가 들고 있는 세션에는 무조건 이 Authentication 객체만 들어갈 수 있으며
들어가는 순간 로그인이 되는 것이고
일반 로그인은 UserDetails
구글, 페이스북 등의 OAuth 로그인은 OAuth2User
들어가게되면 세션이 생기고 로그인이 되는 것이다.
세션 정보를 찾을 때 한 번 찾을 때마다 처리하는 것이 복잡하기 때문에
PrincipalDetails으로 묶는다면 이PrincipalDetails으로 타입만 찾으면 둘 다 번거롭지 않게 찾을 수 있다.
IndexController.java
@GetMapping("/user")
public @ResponseBody String user(@AuthenticationPrincipal PrincipalDetails principalDetails) {
return "user";
}
PrincipalDetails.java - 둘을 묶어놓기
public class PrincipalDetails implements UserDetails, OAuth2User{
....}
[참조] : 인프런 - 스프링부트 시큐리티 & JWT 강의
'Back-end > Spring Boot Security' 카테고리의 다른 글
Spring Boot Security - NAVER(네이버) 로그인 완료하기 (0) | 2022.02.09 |
---|---|
Spring Boot Security - 구글 로그인 및 자동 회원가입 진행 완료 (0) | 2022.02.09 |
Spring Boot Security - 구글 로그인,구글 회원 프로필 정보 받기 (0) | 2022.02.08 |
Spring Boot Security - 시큐리티 권한 처리 (0) | 2022.02.07 |
Spring Boot Security - 시큐리티 회원가입, 로그인 (0) | 2022.02.07 |