Spring Security: Authentication

2022. 1. 21. 15:09·Programming/Spring

Authentication

 

- 세션 영역 안에는 시큐리티 세션 영역이 존재핸다. 

- 시큐리티 세션에 들어 갈 수 있는 객체 타입은 Authentication이다. 

- 시큐리티 세션에 Authentication 객체가 들어갔다? = 로그인이 됐다! 

- Authentication 객체 안에는 2가지 타입만 들어갈 수 있다(UserDetails, OAuth2User)

- Authentication가 필요할 때마다 컨트롤에서 DI 할 수 있다. 

AuthenticationPrincipal이 될 수 있는 2가지 타입

 

1. UserDetails: 일반 로그인

2. OAuth2User: OAuth 로그인

 

단점: 컨트롤에서 AuthenticationPrincipal 꺼낼 때 타입을 구분해줘야 한다. 

해결: UserDetails와 OAuth2User을 둘 다 구현한 구현체를 만든다.(본인은 UserAccount 클래스를 만들었다.)

 

UserAccount.class

@Getter
@Slf4j
public class UserAccount implements UserDetails, OAuth2User {
    private static final long serialVersionUID = 1L;

    private Account account;
    private Map<String, Object> attributes;

    // 일반 시큐리티 로그인시 사용
    public UserAccount(Account account){
        this.account=account;
    }

    // OAuth2.0 로그인시 사용
    public UserAccount(Account account, Map<String, Object> attributes) {
        this.account = account;
        this.attributes = attributes;
    }


    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {

        List<String> roles=account.getRoleList();
        return roles.stream()
                .map(r->new SimpleGrantedAuthority("ROLE_"+ r))
                .collect(Collectors.toSet());

    }

    @Override
    public String getPassword() {
        return account.getPassword();
    }

    @Override
    public String getUsername() {
        if(account.getEmail()==null)
            return account.getNickname();

        return account.getEmail();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }



    @Override
    public Map<String, Object> getAttributes() {
        return attributes;
    }

    @Override
    public String getName() {
        return account.getId()+"";
    }

}

 

OAuth2Controller.class

@Slf4j
@RestController
@RequiredArgsConstructor
public class OAuth2Controller {


    @PreAuthorize("isAuthenticated()")
    @GetMapping("/oauth2/user")
    public UserAccount getOAuth2User(@AuthenticationPrincipal UserAccount user) {

        return user;
    }

    @PreAuthorize("isAuthenticated()")
    @GetMapping("/site/user")
    public UserAccount getSiteUser(@AuthenticationPrincipal  UserAccount user) {

        return user;
    }

    @PreAuthorize("isAuthenticated()")
    @GetMapping("/user")
    public UserAccount getUser(@AuthenticationPrincipal  UserAccount user) {

        return user;
    }


}

'Programming > Spring' 카테고리의 다른 글

Entity, DTO, VO 차이  (0) 2022.02.04
REST API  (0) 2022.01.25
The Custom Authentication Success Handle  (0) 2022.01.20
OAuth2(3) OAuth2 Client 라이브러리 사용 카카오 로그인  (0) 2022.01.20
OAuth2(2) OAuth2 Client 라이브러리 없이 카카오 로그인  (0) 2022.01.20
'Programming/Spring' 카테고리의 다른 글
  • Entity, DTO, VO 차이
  • REST API
  • The Custom Authentication Success Handle
  • OAuth2(3) OAuth2 Client 라이브러리 사용 카카오 로그인
사랑우주인
사랑우주인
  • 사랑우주인
    lovelyAlien
    사랑우주인
  • 전체
    오늘
    어제
  • 글쓰기
    관리
    • 분류 전체보기 (209)
      • Programming (4)
        • Spring (28)
        • Java (46)
        • JPA (2)
        • 디자인 패턴 (5)
        • 개발&아키텍처 (0)
      • Network (14)
      • OS (19)
      • Database (1)
      • Kubernetes (0)
      • Kafka (2)
      • Algorithm (49)
        • BaekJoon (1)
        • Programmers (19)
        • Algorithm (5)
        • Socar (2)
        • LeetCode (19)
      • Interview (2)
      • Issues (2)
      • DotJoin (1)
      • Git (4)
      • 독서 (3)
      • 끄적끄적 (1)
      • 외부활동 (26)
        • 항해플러스 (2)
        • JSCODE 네트워크 (19)
        • JSCODE 자바 (5)
      • SQL (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • GitHub
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    OS
    준영속 엔티티
    lower bounded wildcards
    fcfs
    JSCode
    BFS
    minimum number of arrows to burst balloons
    pacific atlantic water flow
    runner 기법
    운영체제
    Generic
    socar
    clone graph
    Thread
    트랜잭션
    algorithm
    @JsonProperty
    Reorder List
    Oauth2
    Climbing Stairs
    추상화 클래스
    @JsonNaming
    제네릭
    디자인 패턴
    rotting oranges
    RR
    LinkedList
    wildcards
    AuthenticationSuccessHandler
    Process
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.1
사랑우주인
Spring Security: Authentication
상단으로

티스토리툴바