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
반응형
'IT > 자바, 스프링' 카테고리의 다른 글
URL Decoder (퍼센트 인코딩 되돌리기) (0) | 2021.12.06 |
---|---|
데이터 검증을 스프링에서 하지 않고 db로 넘겨주기 (0) | 2021.11.04 |
Spring Security에서 컨트롤러 메서드 별 권한 지정 (@Secured, @PreAuthorize) (0) | 2021.10.22 |
쿠키 생성, 삭제 (0) | 2021.10.15 |
인텔리제이에서 이미 생성된 git repository에 프로젝트 올리기 (0) | 2021.09.27 |