IT/자바, 스프링
UserDetails에서 User 객체 가져오기
thesse
2021. 11. 3. 15:11
300x250
반응형
CustomUserDtails.java
@AllArgsConstructor
@Getter
public class CustomUserDetails implements UserDetails {
private User user;
private Collection<? extends GrantedAuthority> authorities;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() { return authorities; }
@Override
public String getPassword() { return user.getPassword(); }
@Override
public String getUsername() { return user.getName(); }
...
}
UserDetailServiceImpl.java
@Slf4j
@RequiredArgsConstructor
@Service
public class UserDetailServiceImpl implements UserDetailsService {
private final UserRepository userRepository;
private final AccessTokenRepository accessTokenRepository;
@Autowired
private TokenService tokenService;
@Override
public CustomUserDetails loadUserByUsername(String accessToken) throws UsernameNotFoundException {
User user = null;
if (accessToken != null){
// db에서 토큰 조회
AccessToken getToken = accessTokenRepository.findByAccessToken(accessToken);
// 조회되는 토큰이면
if (getToken != null) {
// 액세스 토큰 유효기간 확인
if (getToken.getAccessExpireTime().before(new Timestamp(System.currentTimeMillis()))) {
log.info("token ExpireTime invalid");
} else {
user = getToken.getUser();
// 엑세스 토큰 유효하면 리프레시토큰 유효기간 연장
tokenService.refreshTokenExpireTimeRenewal(getToken);
}}}
// 토큰 없으면 guest
if (user == null) {
user = User.builder()
.role(UserRole.ROLE_GUEST)
.build();
}
return new CustomUserDetails(user, Collections.singleton(
new SimpleGrantedAuthority(
user.getRole().toString())));
}
}
현재 권한 확인 시스템은 다음과 같다
- 커스텀 유저디테일에 User 객체를 넣어두고
- 유저디테일 서비스에서 db를 조회해 User 객체를 만들고
- 만들어진 유저디테일은 시큐리티 필터에서 컨텍스트홀더에 넣어둠
이렇게 해서 컨트롤러에서 @Secured 어노테이션을 써서 접근을 막거나
접근한 유저의 정보를 Authentication에서 뽑아 쓰고 있었다.
그런데 지금까지는 authentication.getName() 한 다음
이 유저 이름으로 다시 db에서 유저 정보를 찾아 쓰고 있었다....
이미 유저디테일에서 조회한건데!
아래처럼 그냥 getUser 해버리면 유저객체가 튀어나온다.
그냥 이걸 가져다 쓰면 된다....
@GetMapping
@Secured("ROLE_USER")
public ResponseEntity getUser(@CurrentSecurityContext(expression = "authentication") Authentication authentication){
CustomUserDetails details = (CustomUserDetails)authentication.getPrincipal();
User user = details.getUser();
...
}
300x250
반응형