[8강] Authentication 객체가 가질 수 있는 2가지 타입
로그인 방식은 2가지가 있다.
- 일반 로그인
- aouth 로그인
<< 왼쪽은 oauth 로그인에 접근하기 위한 코드 >>
일반로그인으로 접근하려면 controller에서
@AuthenticationPrincipal PrincipalDetails userDetails
<< 오른쪽은 일반 로그인에 접근하기 위한 코드 >>
구글로그인으로 접근하려면 controller에서
@AuthenticationPrincipal OAuth2User oauth
=> 일반 로그인은 PrincipalDetails 에서 유저 정보를 가지고 오는 것이고, oauth 로그인에서는 OAuth2User에서 유저의 정보를 가지고 오는 것이다.
이처럼 서로 다른 두 로그인 방식에 접근하기 위해서 서로 다른 방식을 사용해야한다,
🗝️해결
기존 PrincipalDetails 클래스는 1) 아래처럼 UserDetails만 구현하는 상태였지만 2) 추가로 OAuth2User 인터페이스도 함께 구현하여 하나의 클래스에서 2개의 로그인 방식을 모두 처리할 수 있도록 하는 것이다.
// 1) 원래 PrincipalDetails 클래스의 코드
@Data
public class PrincipalDetails implements UserDetails {
private User user;
public PrincipalDetails(User user){
this.user=user;
}
// 2) PrincipalDetails 클래스에 OAuth2User 인터페이스를 추가로 구현하도록 한다.
@Data
public class PrincipalDetails implements UserDetails, OAuth2User {
private User user; //해당 user의 권한을 리턴하는 곳!!
public PrincipalDetails(User user){
this.user=user;
}

⭐@AuthenticationPrincipal이란 ?
@AuthenticationPrincipal은 Spring Security에서 제공하는 어노테이션 중 하나로, 현재 사용자(principal)에 대한 정보를 쉽게 가져오고 주입하기 위해 사용됩니다. 이 어노테이션을 컨트롤러 메서드의 매개변수로 사용하면, Spring Security가 제공하는 인증된 사용자(principal) 정보를 간단하게 가져올 수 있습니다.
principal은 현재 인증된 사용자를 나타내며, 보통 사용자의 식별자나 사용자 정보를 가리킨다.