토큰 인증 정보 가져오기

두주·2024년 1월 25일
0

TIL

목록 보기
39/58

인증된 유저만 진행할 수 있는 게시글 작성, 삭제, 파일 업로드 등에서
userId를 반드시 따로 request에서 받아와야 하는가?

라는 생각에 어차피 토큰에 저장되어 있을 텐데 받아오자. 라고 생각했다.

처음에 작성한 코드

        val userauthentication = SecurityContextHolder.getContext().authentication
        val userPrincipal = userauthentication.principal as UserPrincipal
        val userId = userPrincipal.id

SecurityContextHolder에 저장되어 있는 유저id를 꺼내왔다.

근데 이게 service마다 들어가야하는가? 너무 중복되는 일 아닌가? 라고 생각했다.

두 번째 작성한 코드

@Component
class UserAuthentication {

    fun getUserId() : Long {
        val userauthentication = SecurityContextHolder.getContext().authentication
        val userPrincipal = userauthentication.principal as UserPrincipal
        val userId = userPrincipal.id

        return userId
    }
}

이렇게 getUserId라는 함수를 생성하여, 생성자를 주입한 뒤
userAuthentication.getUserId()를 사용하려 했다.

하지만 가장 간편하고 정확한 방법이 있었는데

세 번째 작성한 코드

    @PostMapping("/upload")
    fun submitHomework(
        @RequestPart("file") file: MultipartFile,
        @RequestPart("submitRequest") submitRequest: SubmitRequest,
        @AuthenticationPrincipal userPrincipal : UserPrincipal
    ) : ResponseEntity <SubmitResponse> {
        return ResponseEntity
            .status(HttpStatus.OK)
            .body(homeworkService.submitHomework(file, submitRequest, userPrincipal))
    }

@AuthenticationPrincipal 어노테이션을 사용해 주면 된다.

사용도 간단했다.

override fun submitHomework(file: MultipartFile, request: SubmitRequest, userPrincipal : UserPrincipal): SubmitResponse {

이렇게 userPrincipal을 넣어놓고

val userId = userPrincipal.id

한 줄로 끝났다.

profile
야옹.

0개의 댓글