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
반응형