Spring security를 구현해서 사용하고 있던 도중 궁금한 것이 생겼다.
인증된 유저는 SecurityContextHolder에 저장되는데 클라이언트한테 로그인한 유저의 정보를 받아올 필요가 있을까??
기존 유저를 조회하는 방식을 보면
@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
private final ResponseService responseService;
@GetMapping("/{userId}")
public SingleResult<TestResponseDto> test(@PathVariable Long id){
return responseService.getSingleResult(userService.test(id));
}
}
이런식으로 URL에 유저 id를 PathVariable로 받아왔다.
하지만 로그인 한 유저는 이미 SecurityContextHolder에 저장되어있기 때문에 이를 가져와서 사용할 수 있다.
@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
private final ResponseService responseService;
@GetMapping()
public SingleResult<TestResponseDto> test(@AuthenticationPrincipal UserDetails userDetails){
return responseService.getSingleResult(userService.test(userDetails.getUsername()));
}
}
바로 이렇게 사용할 수 있지는않고 @AuthenticationPrincipal을 사용하기 위해서는 아래와 같이 UserDetailsService를 따로 구현해줘야 한다.
@Service
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {
private final UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String email) {
return userRepository.findByEmailAndStatus(email, Status.ACTIVE)
.map(this::createUser)
.orElseThrow(() -> new UsernameNotFoundException(email + "->데이터베이스에서 찾을 수 없습니다."));
}
}
(나는 Security에 Username을 email로 등록했다)
email을 이용하여 DB에 접근해 유저의 정보를 받아올 수 있었다.
그러면 이점이 무엇일까? 생각을 해본결과
위 3가지 말고는 다른 이점이 생각나지않는다.
확실한 이점을 아시는분은 댓글 달아주시면 감사하겠습니다.