인증된 유저만 진행할 수 있는 게시글 작성, 삭제, 파일 업로드 등에서
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
한 줄로 끝났다.