쌓고 쌓다
@AuthenticationPrincipal로 컨트롤러에서 회원 정보 받기 본문
컨트롤러에서 인증된 회원 정보를 어떻게 받아서 게시글을 쓰고 수정하고 삭제 등등을 할까? 싶었다.
다음과 같은 방법이 있었다.
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";
}
'프로그래밍 > spring' 카테고리의 다른 글
Entity와 DTO의 분리 필요성 및 방법 (0) | 2024.01.22 |
---|---|
BCryptPasswordEncoder.encode 값이 매번 달라지는 이유 및 비교방법 (0) | 2024.01.20 |
Spring Security JWT 토큰 발급 및 서버 구축 (0) | 2024.01.19 |
Spring Security JWT를 위한 로그인 (0) | 2024.01.18 |
Spring Security 필터 (0) | 2024.01.17 |