쌓고 쌓다

@AuthenticationPrincipal로 컨트롤러에서 회원 정보 받기 본문

프로그래밍/spring

@AuthenticationPrincipal로 컨트롤러에서 회원 정보 받기

승민아 2024. 1. 19. 14:04

컨트롤러에서 인증된 회원 정보를 어떻게 받아서 게시글을 쓰고 수정하고 삭제 등등을 할까? 싶었다.

 

다음과 같은 방법이 있었다.

 

1. SecurityContextHolder에서 꺼내기

    @GetMapping("/get1")
    public String get1() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        PrincipalDetails principal = (PrincipalDetails) authentication.getPrincipal();
        TestUser testUser = principal.getTestUser();
        System.out.println("[1] testUser = " + testUser);
        return "ok";
    }

 

SecurityContextHolder???

최근에 JWT를 공부하며 로그인을 위해 작성한 코드중 일부이다.

이때 SecurityContextHolder에 authentication을 왜 저장하는지 이해가 안갔었는데 여기서 써먹게 될 줄이다.!

아직 확실히 모르지만 뭔가 복선 느낌이다..

여기서 저장해둔 authentication을 인증하여 꺼내 가져오는것이다.

 

다음은 스프링 시큐리티의 AuthenticationFilter를 거쳐 인증 완료시 

Authentication을 구현한 UsernamePasswordAuthenticatinToken을 SecurityContextHolder에 저장하는 과정이다. 참고하자.

 

 

2. @AuthenticationPrincipal 어노테이션 사용하기

    @GetMapping("/get2")
    public String get2(@AuthenticationPrincipal PrincipalDetails principalDetails) {
        TestUser testUser = principalDetails.getTestUser();
        System.out.println("[2] testUser = " + testUser);
        return "ok";
    }

 

@AuthenticationPrincipal 어노테이션으로

SecurityContextHolder.getContext().getAuthentication().getPrincipal() 과정을 거칠 수 있다.

 

SecurityContextHolder.getContext().getAuthentication().getPrincipal()에 우리가 넣어둔 TestUser를 꺼내고 싶다면

getTestUser 과정을 거쳐야하는데

 

이 과정도 "expression" 옵션을 넣어 자동으로 할 수 있다.

@GetMapping("/write3")
    public String write3(@AuthenticationPrincipal(expression = "testUser") TestUser testUser) {
        System.out.println("[3] testUser = " + testUser);
        return "ok";
    }

 

미인증된 사용자인 경우, Header에 Authorization가 없는경우 String으로 "anonymousUser"를 반환하기에

처리를하기 위해 다음과 같이 작성할 수 있다.

    @GetMapping("/write3")
    public String write3(@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : testUser") String testUser) {
        if(testUser==null) {
            System.out.println("널이유");
        } else {
            System.out.println("[3] testUser = " + testUser);
        }

        return "ok";
    }
Comments