ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Security - 구글 로그인 및 자동 회원가입
    Framework & Library/Spring Security 2021. 10. 4. 15:00

    UserDetails, OAuth2User 타입의 통합

    PrincipalDetails 클래스 수정

     

    로그인 사용자의 정보와 OAuth 로그인 사용자의 정보를 받는 타입이 UserDetails, OAuth2User로 서로 다르기 때문에 구현하는데 불편함이 있었다.

    ㆍ 이러한 불편함을 없애기 위해 두 개의 타입을 처리할 수 있는 클래스가 필요하다.

    ㆍ 위 사진과 같이 기존의 PrincipalDetails 클래스에 OAuth2User 인터페이스를 추가로 구현한다.

    ㆍ OAuth 로그인 사용자의 정보를 받기 위해 Map<String, Object> 타입의 변수인 attributes를 선언하고, 생성자를 추가한다.

     

     

    OAuth2User 인터페이스를 구현하고 getAttributes() 메서드와 getName() 메서드 위 사진과 같이 오버라이딩한다.

     

    User 객체 속성 추가

     

    ㆍ OAuth 로그인 사용자의 정보를 받기 위해 User 객체에 위 사진에 표시된 속성과 생성자를 추가한다.

     

    PrincipalOauth2UserService 클래스 수정

     

    ㆍ OAuth 로그인 사용자의 비밀번호를 암호화해줄 객체인 BCryptPasswordEncoder를 @Autowired 애너테이션을 통해 선언한다.

     

     

    ㆍ loadUser() 메서드에 위 사진에 표시된 코드를 추가한다.

    ㆍ OAuth 로그인을 수행한 사용자에 대한 정보를 받고, 로그인을 수행한 사용자의 username이 DB에 없을 경우 받은 정보로 객체를 생성한 후 DB에 저장하는 방식을 통해 회원가입을 집행한다.


    테스트

    IndexController 클래스 수정

     

    ㆍ IndexController 클래스에 기존의 user() 메서드를 위 사진과 같이 변경한다.

    ㆍ PrincipalDetails객체를  @AuthenticationPrincipal 애너테이션을 통해 매개변수로 받음으로써 일반 로그인 사용자와 OAuth 로그인 사용자에 대한 정보를 분리된 메서드가 아닌 하나에 메서드를 통해 받을 수 있다.

     

    일반 로그인 수행

     

    ㆍ 일반 로그인을 수행한 후 /user 주소에 접속하고 콘솔 창의 사용자 정보를 확인한다.

    ㆍ 사용자의 정보가 정확하게 출력되고 있음을 확인하였다.

     

    OAuth 로그인 수행

     

    ㆍ OAuth 로그인을 수행한 후 /user 주소에 접속하고 콘솔 창의 사용자 정보를 확인한다.

    ㆍ 사용자의 정보가 정확하게 출력되고 있음을 확인하였다.


    결론

    일반 로그인 사용자에 대한 정보를 받을 수 있는 타입은 UserDetails이고, OAuth 로그인 사용자에 대한 정보를 받을 수 있는 타입은 OAuth2User로 서로 다른 타입이다. 

    서로 다른 타입이기 때문에 두 가지 로그인 방식에 대한 정보를 받기 위해서는 서로 다른 메서드를 구현해야 한다.

    서로 다른 메서드를 구현하는 방법은 비효율적이기 때문에 UserDetails와 OAuth2User 타입을 모두 커버하는 또 다른 클래스를 구현함으로써 위 문제를 해결한다.

    UserDetails 인터페이스와 OAuth2User 인터페이스를 구현하는 PrincipalDetails라는 클래스를 만들어 PrincipalDetailService 클래스와 PrincipalOauth2UserService 클래스를 통해 두 가지 타입을 모두 처리하는 방식으로 위 문제를 해결하였다.


     

    GitHub - qlsdud0604/spring-security-basic: 스프링 시큐리티의 기초를 학습하는 공간

    스프링 시큐리티의 기초를 학습하는 공간. Contribute to qlsdud0604/spring-security-basic development by creating an account on GitHub.

    github.com

     

    728x90

    댓글

Designed by Tistory.