public boolean validateToken(String token) {
try {
Jwts.parserBuilder().setSigningKey(getSigningKey()).build().parseClaimsJws(token);
return true;
} catch (Exception e) {
System.out.println("JWT validation failed: " + e.getMessage());
return false;
}
}
JWT validation failed: Expired JWT 메시지를 확인하고, 만료 시간 설정 실수를 발견.public enum Role {
CUSTOMER, OWNER, ADMIN
}
엔티티도 수정
@Enumerated(EnumType.STRING)
private Role role;
2.JWT 토큰 생성 시 Role을 claim으로 추가
public String createToken(String email, Role role) {
String token = Jwts.builder()
.setSubject(email)
.claim("role", role)
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(getSigningKey(), SignatureAlgorithm.HS256)
.compact();
return token;
}
getAuthentication 수정public Authentication getAuthentication(String token) {
String email = getUsernameFromToken(token);
Optional<User> user = userRepository.findByEmail(email);
if (user.isPresent()) {
String role = (String) Jwts.parserBuilder()
.setSigningKey(getSigningKey())
.build()
.parseClaimsJws(token)
.getBody()
.get("role");
System.out.println("Role from token: " + role);
// 권한을 GrantedAuthority로 변환
GrantedAuthority authority = new SimpleGrantedAuthority(role);
// 인증 객체 생성
return new UsernamePasswordAuthenticationToken(user.get(), null, List.of(authority));
}
return null;
}
@Override
public String login(LoginRequestDto loginRequestDto) {
// 로그인 로직 구현
User user = userRepository.findByEmail(loginRequestDto.getEmail())
.orElseThrow(() -> new IllegalArgumentException("Invalid email"));
if (passwordEncoder.matches(loginRequestDto.getPassword(), user.getPassword())) {
String role = "ROLE_" + user.getRole().name();
return jwtUtil.createToken(user.getEmail(), role);
} else {
throw new IllegalArgumentException("Invalid password");
}
}
// 접근 권한 설정
http.authorizeHttpRequests((authorizeRequests) ->
authorizeRequests
// 인증 없이 접근 가능 경로 (회원가입, 로그인)
.requestMatchers("/api/v1/users/**").permitAll()
// 권한을 가진 사용자만 접근 가능 경로
.requestMatchers("/api/v1/auth/**").hasAnyRole("CUSTOMER", "OWNER")
// ADMIN 권한을 가진 사용자만 접근 가능한 경로
.requestMatchers("/api/v1/admin/**").hasRole("ADMIN")
// 인증 필요한 경로
.anyRequest().authenticated());
//.anyRequest().permitAll()
권한 추가 부분은 하고나서 찜찜해서 내일 또 다시 확인해보고 더 좋은 방법이 있는지 확인해봐야겠다..