diff --git a/src/main/java/com/somemore/center/service/NEWCenterQueryService.java b/src/main/java/com/somemore/center/service/NEWCenterQueryService.java new file mode 100644 index 000000000..01dfe7397 --- /dev/null +++ b/src/main/java/com/somemore/center/service/NEWCenterQueryService.java @@ -0,0 +1,31 @@ +package com.somemore.center.service; + +import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.NEWCenterRepository; +import com.somemore.center.usecase.NEWCenterQueryUseCase; +import com.somemore.global.exception.ExceptionMessage; +import com.somemore.global.exception.NoSuchElementException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class NEWCenterQueryService implements NEWCenterQueryUseCase { + + private final NEWCenterRepository centerRepository; + + @Override + public NEWCenter getByUserId(UUID userId) { + return centerRepository.findByUserId(userId) + .orElseThrow(() -> new NoSuchElementException(ExceptionMessage.NOT_EXISTS_CENTER)); + } + + @Override + public UUID getIdByUserId(UUID userId) { + return getByUserId(userId).getId(); + } +} diff --git a/src/main/java/com/somemore/center/usecase/NEWCenterQueryUseCase.java b/src/main/java/com/somemore/center/usecase/NEWCenterQueryUseCase.java new file mode 100644 index 000000000..9131eee7f --- /dev/null +++ b/src/main/java/com/somemore/center/usecase/NEWCenterQueryUseCase.java @@ -0,0 +1,12 @@ +package com.somemore.center.usecase; + +import com.somemore.center.domain.NEWCenter; + +import java.util.UUID; + +public interface NEWCenterQueryUseCase { + + NEWCenter getByUserId(UUID userId); + + UUID getIdByUserId(UUID userId); +} diff --git a/src/main/java/com/somemore/global/auth/annotation/RoleId.java b/src/main/java/com/somemore/global/auth/annotation/RoleId.java new file mode 100644 index 000000000..606153df7 --- /dev/null +++ b/src/main/java/com/somemore/global/auth/annotation/RoleId.java @@ -0,0 +1,11 @@ +package com.somemore.global.auth.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.PARAMETER) +public @interface RoleId { +} diff --git a/src/main/java/com/somemore/global/auth/annotation/RoleIdArgumentResolver.java b/src/main/java/com/somemore/global/auth/annotation/RoleIdArgumentResolver.java new file mode 100644 index 000000000..af69302d0 --- /dev/null +++ b/src/main/java/com/somemore/global/auth/annotation/RoleIdArgumentResolver.java @@ -0,0 +1,40 @@ +package com.somemore.global.auth.annotation; + +import com.somemore.global.auth.authentication.UserIdentity; +import com.somemore.global.exception.InvalidAuthenticationException; +import org.springframework.core.MethodParameter; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +import static com.somemore.global.exception.ExceptionMessage.AUTHENTICATION_MISSING; +import static com.somemore.global.exception.ExceptionMessage.INVALID_PRINCIPAL_TYPE; + +@Component +public class RoleIdArgumentResolver implements HandlerMethodArgumentResolver { + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.hasParameterAnnotation(RoleId.class); + } + + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication == null) { + throw new InvalidAuthenticationException(AUTHENTICATION_MISSING); + } + + if (authentication.getPrincipal() instanceof UserIdentity principal) { + return principal.roleId(); + } + + throw new InvalidAuthenticationException(INVALID_PRINCIPAL_TYPE); + } +} diff --git a/src/main/java/com/somemore/global/auth/annotation/UserId.java b/src/main/java/com/somemore/global/auth/annotation/UserId.java new file mode 100644 index 000000000..bf258d596 --- /dev/null +++ b/src/main/java/com/somemore/global/auth/annotation/UserId.java @@ -0,0 +1,11 @@ +package com.somemore.global.auth.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.PARAMETER) +public @interface UserId { +} diff --git a/src/main/java/com/somemore/global/auth/annotation/UserIdArgumentResolver.java b/src/main/java/com/somemore/global/auth/annotation/UserIdArgumentResolver.java new file mode 100644 index 000000000..2c49ba273 --- /dev/null +++ b/src/main/java/com/somemore/global/auth/annotation/UserIdArgumentResolver.java @@ -0,0 +1,40 @@ +package com.somemore.global.auth.annotation; + +import com.somemore.global.auth.authentication.UserIdentity; +import com.somemore.global.exception.InvalidAuthenticationException; +import org.springframework.core.MethodParameter; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +import static com.somemore.global.exception.ExceptionMessage.AUTHENTICATION_MISSING; +import static com.somemore.global.exception.ExceptionMessage.INVALID_PRINCIPAL_TYPE; + +@Component +public class UserIdArgumentResolver implements HandlerMethodArgumentResolver { + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.hasParameterAnnotation(UserId.class); + } + + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication == null) { + throw new InvalidAuthenticationException(AUTHENTICATION_MISSING); + } + + if (authentication.getPrincipal() instanceof UserIdentity principal) { + return principal.userId(); + } + + return new InvalidAuthenticationException(INVALID_PRINCIPAL_TYPE); + } +} diff --git a/src/main/java/com/somemore/global/auth/authentication/JwtAuthenticationToken.java b/src/main/java/com/somemore/global/auth/authentication/JwtAuthenticationToken.java index 404aee42a..e08b88606 100644 --- a/src/main/java/com/somemore/global/auth/authentication/JwtAuthenticationToken.java +++ b/src/main/java/com/somemore/global/auth/authentication/JwtAuthenticationToken.java @@ -1,22 +1,20 @@ package com.somemore.global.auth.authentication; import com.somemore.global.auth.jwt.domain.EncodedToken; -import com.somemore.user.domain.User; import lombok.EqualsAndHashCode; import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; -import java.io.Serializable; import java.util.Collection; import java.util.List; @EqualsAndHashCode(callSuper = true) public class JwtAuthenticationToken extends AbstractAuthenticationToken { - private final Serializable principal; + private final UserIdentity principal; private final transient Object credentials; - public JwtAuthenticationToken(Serializable principal, + public JwtAuthenticationToken(UserIdentity principal, Object credentials, Collection authorities) { super(authorities); @@ -35,19 +33,11 @@ public Object getPrincipal() { return principal; } - public static JwtAuthenticationToken of(User user, EncodedToken accessToken) { + public static JwtAuthenticationToken of(UserIdentity userIdentity, EncodedToken accessToken) { return new JwtAuthenticationToken( - user.getId(), + userIdentity, accessToken, - List.of(new SimpleGrantedAuthority(user.getRole().getAuthority())) - ); - } - - public static JwtAuthenticationToken of(String userId, String role, EncodedToken accessToken) { - return new JwtAuthenticationToken( - userId, - accessToken, - List.of(new SimpleGrantedAuthority(role)) + List.of(new SimpleGrantedAuthority(userIdentity.role().getAuthority())) ); } } diff --git a/src/main/java/com/somemore/global/auth/authentication/UserIdentity.java b/src/main/java/com/somemore/global/auth/authentication/UserIdentity.java new file mode 100644 index 000000000..4d217ee17 --- /dev/null +++ b/src/main/java/com/somemore/global/auth/authentication/UserIdentity.java @@ -0,0 +1,27 @@ +package com.somemore.global.auth.authentication; + +import com.somemore.user.domain.UserRole; +import io.jsonwebtoken.Claims; + +import java.io.Serializable; +import java.util.UUID; + +public record UserIdentity( + UUID userId, + UUID roleId, + UserRole role +) implements Serializable { + + public static UserIdentity of(UUID userId, UUID roleId, UserRole role) { + return new UserIdentity(userId, roleId, role); + } + + public static UserIdentity from(Claims claims) { + UUID userId = UUID.fromString(claims.get("userId", String.class)); + UUID roleId = UUID.fromString(claims.get("roleId", String.class)); + UserRole role = UserRole.from( + claims.get("role", String.class)); + + return new UserIdentity(userId, roleId, role); + } +} diff --git a/src/main/java/com/somemore/global/auth/idpw/filter/IdPwAuthFilter.java b/src/main/java/com/somemore/global/auth/idpw/filter/IdPwAuthFilter.java index ebbbf798d..36d78a9c7 100644 --- a/src/main/java/com/somemore/global/auth/idpw/filter/IdPwAuthFilter.java +++ b/src/main/java/com/somemore/global/auth/idpw/filter/IdPwAuthFilter.java @@ -1,9 +1,9 @@ package com.somemore.global.auth.idpw.filter; import com.fasterxml.jackson.databind.ObjectMapper; +import com.somemore.global.auth.authentication.UserIdentity; import com.somemore.global.auth.jwt.domain.EncodedToken; import com.somemore.global.auth.jwt.usecase.GenerateTokensOnLoginUseCase; -import com.somemore.user.domain.UserRole; import jakarta.servlet.FilterChain; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -16,11 +16,9 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.GrantedAuthority; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import java.io.IOException; -import java.util.UUID; @RequiredArgsConstructor @Slf4j @@ -28,7 +26,6 @@ public class IdPwAuthFilter extends UsernamePasswordAuthenticationFilter { private final AuthenticationManager authenticationManager; private final GenerateTokensOnLoginUseCase generateTokensOnLoginUseCase; - // private final CookieUseCase cookieUseCase; private final ObjectMapper objectMapper; @Override @@ -43,22 +40,11 @@ public Authentication attemptAuthentication(HttpServletRequest request, HttpServ @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) { response.setStatus(HttpServletResponse.SC_OK); - String userId = authResult.getName(); - String role = extractRole(authResult); - EncodedToken accessToken = - generateTokensOnLoginUseCase.generateAuthTokensAndReturnAccessToken( - UUID.fromString(userId), - UserRole.from(role)); - response.setHeader("Authorization", accessToken.getValueWithPrefix()); - // cookieUseCase.setAccessToken(response, accessToken.value()); - } + UserIdentity userIdentity = (UserIdentity) authResult.getPrincipal(); + EncodedToken accessToken = generateTokensOnLoginUseCase.generateAuthTokensAndReturnAccessToken(userIdentity); - private static String extractRole(Authentication authResult) { - return authResult.getAuthorities().stream() - .findFirst() - .map(GrantedAuthority::getAuthority) - .orElseThrow(() -> new IllegalStateException("유저 권한 자체가 존재하지 않습니다.")); + response.setHeader("Authorization", accessToken.getValueWithPrefix()); } @Override diff --git a/src/main/java/com/somemore/global/auth/idpw/provider/CustomAuthenticationProvider.java b/src/main/java/com/somemore/global/auth/idpw/provider/CustomAuthenticationProvider.java index d81f9031b..e1514e53a 100644 --- a/src/main/java/com/somemore/global/auth/idpw/provider/CustomAuthenticationProvider.java +++ b/src/main/java/com/somemore/global/auth/idpw/provider/CustomAuthenticationProvider.java @@ -1,11 +1,15 @@ package com.somemore.global.auth.idpw.provider; +import com.somemore.center.usecase.NEWCenterQueryUseCase; import com.somemore.global.auth.authentication.JwtAuthenticationToken; +import com.somemore.global.auth.authentication.UserIdentity; import com.somemore.global.auth.jwt.domain.EncodedToken; import com.somemore.global.auth.jwt.domain.TokenType; import com.somemore.global.auth.jwt.usecase.JwtUseCase; import com.somemore.user.domain.User; +import com.somemore.user.domain.UserRole; import com.somemore.user.usecase.UserQueryUseCase; +import com.somemore.volunteer.usecase.NEWVolunteerQueryUseCase; import lombok.RequiredArgsConstructor; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.BadCredentialsException; @@ -16,6 +20,8 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import java.util.UUID; + @Component @RequiredArgsConstructor @Transactional(readOnly = true) @@ -24,6 +30,8 @@ public class CustomAuthenticationProvider implements AuthenticationProvider { private final JwtUseCase jwtUseCase; private final PasswordEncoder passwordEncoder; private final UserQueryUseCase userQueryUseCase; + private final NEWVolunteerQueryUseCase volunteerQueryUseCase; + private final NEWCenterQueryUseCase centerQueryUseCase; @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { @@ -34,9 +42,15 @@ public Authentication authenticate(Authentication authentication) throws Authent validatePassword(rawAccountPassword, user.getAccountPassword()); - EncodedToken accessToken = generateAccessToken(user); + UUID userId = user.getId(); + UserRole role = user.getRole(); + UUID roleId = getRoleIdByUserId(role, user.getId()); + + UserIdentity userIdentity = UserIdentity.of(userId, roleId, role); + + EncodedToken accessToken = generateAccessToken(userIdentity); - return JwtAuthenticationToken.of(user, accessToken); + return JwtAuthenticationToken.of(userIdentity, accessToken); } @Override @@ -44,10 +58,16 @@ public boolean supports(Class authentication) { return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication); } - private EncodedToken generateAccessToken(User user) { + private UUID getRoleIdByUserId(UserRole role, UUID userId) { + if (role.equals(UserRole.VOLUNTEER)) { + return volunteerQueryUseCase.getIdByUserId(userId); + } + return centerQueryUseCase.getIdByUserId(userId); + } + + private EncodedToken generateAccessToken(UserIdentity userIdentity) { return jwtUseCase.generateToken( - user.getId().toString(), - user.getRole().getAuthority(), + userIdentity, TokenType.ACCESS ); } diff --git a/src/main/java/com/somemore/global/auth/jwt/filter/JwtAuthFilter.java b/src/main/java/com/somemore/global/auth/jwt/filter/JwtAuthFilter.java index 8bd75bf94..53f4991a6 100644 --- a/src/main/java/com/somemore/global/auth/jwt/filter/JwtAuthFilter.java +++ b/src/main/java/com/somemore/global/auth/jwt/filter/JwtAuthFilter.java @@ -1,6 +1,7 @@ package com.somemore.global.auth.jwt.filter; import com.somemore.global.auth.authentication.JwtAuthenticationToken; +import com.somemore.global.auth.authentication.UserIdentity; import com.somemore.global.auth.jwt.domain.EncodedToken; import com.somemore.global.auth.jwt.domain.TokenType; import com.somemore.global.auth.jwt.exception.JwtErrorType; @@ -14,7 +15,6 @@ import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @@ -49,7 +49,7 @@ protected void doFilterInternal(HttpServletRequest request, jwtUseCase.processAccessToken(accessToken, response); Claims claims = jwtUseCase.getClaims(accessToken); - Authentication auth = createAuthenticationToken(claims, accessToken); + JwtAuthenticationToken auth = createAuthenticationToken(claims, accessToken); SecurityContextHolder.getContext().setAuthentication(auth); filterChain.doFilter(request, response); @@ -96,9 +96,8 @@ private EncodedToken findAccessTokenFromCookie(HttpServletRequest request) { private JwtAuthenticationToken createAuthenticationToken(Claims claims, EncodedToken accessToken) { - String userId = claims.get("id", String.class); - String role = claims.get("role", String.class); + UserIdentity userIdentity = UserIdentity.from(claims); - return JwtAuthenticationToken.of(userId, role, accessToken); + return JwtAuthenticationToken.of(userIdentity, accessToken); } } diff --git a/src/main/java/com/somemore/global/auth/jwt/generator/HmacJwtGenerator.java b/src/main/java/com/somemore/global/auth/jwt/generator/HmacJwtGenerator.java index a1ecf53f1..05d772ae8 100644 --- a/src/main/java/com/somemore/global/auth/jwt/generator/HmacJwtGenerator.java +++ b/src/main/java/com/somemore/global/auth/jwt/generator/HmacJwtGenerator.java @@ -1,5 +1,6 @@ package com.somemore.global.auth.jwt.generator; +import com.somemore.global.auth.authentication.UserIdentity; import com.somemore.global.auth.jwt.domain.EncodedToken; import com.somemore.global.auth.jwt.domain.TokenType; import io.jsonwebtoken.Claims; @@ -20,8 +21,8 @@ public class HmacJwtGenerator implements JwtGenerator { public static final MacAlgorithm ALGORITHM = Jwts.SIG.HS256; private final SecretKey secretKey; - public EncodedToken generateToken(String userId, String role, TokenType tokenType) { - Claims claims = buildClaims(userId, role); + public EncodedToken generateToken(UserIdentity userIdentity, TokenType tokenType) { + Claims claims = buildClaims(userIdentity); Instant now = Instant.now(); Instant expiration = now.plusMillis(tokenType.getPeriodInMillis()); String uniqueId = UUID.randomUUID().toString(); // JTI @@ -37,11 +38,11 @@ public EncodedToken generateToken(String userId, String role, TokenType tokenTyp ); } - private static Claims buildClaims(String userId, String role) { - + private static Claims buildClaims(UserIdentity userIdentity) { return Jwts.claims() - .add("id", userId) - .add("role", role) + .add("userId", userIdentity.userId()) + .add("roleId", userIdentity.roleId()) + .add("role", userIdentity.role().getAuthority()) .build(); } } diff --git a/src/main/java/com/somemore/global/auth/jwt/generator/JwtGenerator.java b/src/main/java/com/somemore/global/auth/jwt/generator/JwtGenerator.java index 9261bbaf6..79f135b49 100644 --- a/src/main/java/com/somemore/global/auth/jwt/generator/JwtGenerator.java +++ b/src/main/java/com/somemore/global/auth/jwt/generator/JwtGenerator.java @@ -1,8 +1,10 @@ package com.somemore.global.auth.jwt.generator; +import com.somemore.global.auth.authentication.UserIdentity; import com.somemore.global.auth.jwt.domain.EncodedToken; import com.somemore.global.auth.jwt.domain.TokenType; public interface JwtGenerator { - EncodedToken generateToken(String userId, String role, TokenType tokenType); + + EncodedToken generateToken(UserIdentity userIdentity, TokenType tokenType); } diff --git a/src/main/java/com/somemore/global/auth/jwt/refresher/DefaultJwtRefresher.java b/src/main/java/com/somemore/global/auth/jwt/refresher/DefaultJwtRefresher.java index 9a1eaa2cc..ea651821d 100644 --- a/src/main/java/com/somemore/global/auth/jwt/refresher/DefaultJwtRefresher.java +++ b/src/main/java/com/somemore/global/auth/jwt/refresher/DefaultJwtRefresher.java @@ -1,5 +1,6 @@ package com.somemore.global.auth.jwt.refresher; +import com.somemore.global.auth.authentication.UserIdentity; import com.somemore.global.auth.jwt.domain.EncodedToken; import com.somemore.global.auth.jwt.domain.RefreshToken; import com.somemore.global.auth.jwt.domain.TokenType; @@ -37,8 +38,7 @@ public EncodedToken refreshAccessToken(EncodedToken accessToken) { private EncodedToken generateAccessToken(Claims claims) { return jwtGenerator.generateToken( - claims.get("id", String.class), - claims.get("role", String.class), + UserIdentity.from(claims), TokenType.ACCESS ); } diff --git a/src/main/java/com/somemore/global/auth/jwt/service/GenerateTokensOnLoginService.java b/src/main/java/com/somemore/global/auth/jwt/service/GenerateTokensOnLoginService.java index 5197d0b79..5092bc8c4 100644 --- a/src/main/java/com/somemore/global/auth/jwt/service/GenerateTokensOnLoginService.java +++ b/src/main/java/com/somemore/global/auth/jwt/service/GenerateTokensOnLoginService.java @@ -1,19 +1,17 @@ package com.somemore.global.auth.jwt.service; +import com.somemore.global.auth.authentication.UserIdentity; import com.somemore.global.auth.jwt.domain.EncodedToken; import com.somemore.global.auth.jwt.domain.RefreshToken; import com.somemore.global.auth.jwt.domain.TokenType; import com.somemore.global.auth.jwt.generator.JwtGenerator; import com.somemore.global.auth.jwt.manager.TokenManager; import com.somemore.global.auth.jwt.usecase.GenerateTokensOnLoginUseCase; -import com.somemore.user.domain.UserRole; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.UUID; - @Service @RequiredArgsConstructor @Slf4j @@ -24,32 +22,30 @@ public class GenerateTokensOnLoginService implements GenerateTokensOnLoginUseCas private final TokenManager tokenManager; @Override - public EncodedToken generateLoginToken(UUID userId, UserRole role) { - return generateToken(userId, role, TokenType.SIGN_IN); + public EncodedToken generateLoginToken(UserIdentity userIdentity) { + return generateToken(userIdentity, TokenType.SIGN_IN); } @Override - public EncodedToken generateAuthTokensAndReturnAccessToken(UUID userId, UserRole role) { - EncodedToken accessToken = generateToken(userId, role, TokenType.ACCESS); - RefreshToken refreshToken = generateRefreshTokenWithAccessToken(userId, role, accessToken); + public EncodedToken generateAuthTokensAndReturnAccessToken(UserIdentity userIdentity) { + EncodedToken accessToken = generateToken(userIdentity, TokenType.ACCESS); + RefreshToken refreshToken = generateRefreshTokenWithAccessToken(userIdentity, accessToken); saveRefreshToken(refreshToken); return accessToken; } - private EncodedToken generateToken(UUID userId, UserRole role, TokenType tokenType) { - return jwtGenerator.generateToken( - userId.toString(), - role.getAuthority(), - tokenType - ); + private EncodedToken generateToken(UserIdentity userIdentity, TokenType tokenType) { + return jwtGenerator.generateToken(userIdentity, tokenType); } - private RefreshToken generateRefreshTokenWithAccessToken(UUID userId, UserRole role, EncodedToken accessToken) { + private RefreshToken generateRefreshTokenWithAccessToken(UserIdentity userIdentity, EncodedToken accessToken) { + EncodedToken refreshToken = generateToken(userIdentity, TokenType.REFRESH); + return new RefreshToken( - userId.toString(), + userIdentity.userId().toString(), accessToken, - generateToken(userId, role, TokenType.REFRESH) + refreshToken ); } diff --git a/src/main/java/com/somemore/global/auth/jwt/service/JwtService.java b/src/main/java/com/somemore/global/auth/jwt/service/JwtService.java index 9c7ce62d0..d458c0001 100644 --- a/src/main/java/com/somemore/global/auth/jwt/service/JwtService.java +++ b/src/main/java/com/somemore/global/auth/jwt/service/JwtService.java @@ -1,5 +1,6 @@ package com.somemore.global.auth.jwt.service; +import com.somemore.global.auth.authentication.UserIdentity; import com.somemore.global.auth.jwt.domain.EncodedToken; import com.somemore.global.auth.jwt.domain.TokenType; import com.somemore.global.auth.jwt.exception.JwtErrorType; @@ -25,8 +26,8 @@ public class JwtService implements JwtUseCase { private final JwtRefresher jwtRefresher; @Override - public EncodedToken generateToken(String userId, String role, TokenType tokenType) { - return jwtGenerator.generateToken(userId, role, tokenType); + public EncodedToken generateToken(UserIdentity userIdentity, TokenType tokenType) { + return jwtGenerator.generateToken(userIdentity, tokenType); } @Override diff --git a/src/main/java/com/somemore/global/auth/jwt/usecase/GenerateTokensOnLoginUseCase.java b/src/main/java/com/somemore/global/auth/jwt/usecase/GenerateTokensOnLoginUseCase.java index 3bdf560a3..b3e1fd183 100644 --- a/src/main/java/com/somemore/global/auth/jwt/usecase/GenerateTokensOnLoginUseCase.java +++ b/src/main/java/com/somemore/global/auth/jwt/usecase/GenerateTokensOnLoginUseCase.java @@ -1,12 +1,10 @@ package com.somemore.global.auth.jwt.usecase; +import com.somemore.global.auth.authentication.UserIdentity; import com.somemore.global.auth.jwt.domain.EncodedToken; -import com.somemore.user.domain.UserRole; - -import java.util.UUID; public interface GenerateTokensOnLoginUseCase { - EncodedToken generateLoginToken(UUID userId, UserRole role); + EncodedToken generateLoginToken(UserIdentity userIdentity); - EncodedToken generateAuthTokensAndReturnAccessToken(UUID userId, UserRole role); + EncodedToken generateAuthTokensAndReturnAccessToken(UserIdentity userIdentity); } diff --git a/src/main/java/com/somemore/global/auth/jwt/usecase/JwtUseCase.java b/src/main/java/com/somemore/global/auth/jwt/usecase/JwtUseCase.java index 7e48d8599..90ff83e3e 100644 --- a/src/main/java/com/somemore/global/auth/jwt/usecase/JwtUseCase.java +++ b/src/main/java/com/somemore/global/auth/jwt/usecase/JwtUseCase.java @@ -1,15 +1,16 @@ package com.somemore.global.auth.jwt.usecase; +import com.somemore.global.auth.authentication.UserIdentity; import com.somemore.global.auth.jwt.domain.EncodedToken; import com.somemore.global.auth.jwt.domain.TokenType; import io.jsonwebtoken.Claims; import jakarta.servlet.http.HttpServletResponse; public interface JwtUseCase { - EncodedToken generateToken(String userId, String role, TokenType tokenType); + + EncodedToken generateToken(UserIdentity userIdentity, TokenType tokenType); void processAccessToken(EncodedToken token, HttpServletResponse response); Claims getClaims(EncodedToken token); - } diff --git a/src/main/java/com/somemore/global/auth/oauth/handler/CustomOAuthSuccessHandler.java b/src/main/java/com/somemore/global/auth/oauth/handler/CustomOAuthSuccessHandler.java index 0a4f40fd0..c63853866 100644 --- a/src/main/java/com/somemore/global/auth/oauth/handler/CustomOAuthSuccessHandler.java +++ b/src/main/java/com/somemore/global/auth/oauth/handler/CustomOAuthSuccessHandler.java @@ -1,5 +1,6 @@ package com.somemore.global.auth.oauth.handler; +import com.somemore.global.auth.authentication.UserIdentity; import com.somemore.global.auth.cookie.CookieUseCase; import com.somemore.global.auth.jwt.domain.EncodedToken; import com.somemore.global.auth.jwt.domain.TokenType; @@ -8,6 +9,7 @@ import com.somemore.global.auth.oauth.processor.OAuthUserProcessor; import com.somemore.global.auth.redirect.RedirectUseCase; import com.somemore.user.domain.UserRole; +import com.somemore.volunteer.usecase.NEWVolunteerQueryUseCase; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -26,6 +28,7 @@ public class CustomOAuthSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { private final OAuthUserProcessor oauthUserProcessor; + private final NEWVolunteerQueryUseCase volunteerQueryUseCase; private final GenerateTokensOnLoginUseCase generateTokensOnLoginUseCase; private final CookieUseCase cookieUseCase; private final RedirectUseCase redirectUseCase; @@ -37,9 +40,14 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { CustomOAuth2User oauthUser = extractOAuthUser(authentication); + UUID userId = oauthUserProcessor.fetchUserIdByOAuthUser(oauthUser); + UUID volunteerId = volunteerQueryUseCase.getIdByUserId(userId); + UserRole role = UserRole.getOAuthUserDefaultRole(); + + UserIdentity userIdentity = UserIdentity.of(userId, volunteerId, role); - processAccessToken(response, userId); + processToken(response, userIdentity); redirect(request, response); } @@ -48,13 +56,10 @@ private void redirect(HttpServletRequest request, HttpServletResponse response) redirectUseCase.redirect(request, response, SUCCESS_PATH); } - private void processAccessToken(HttpServletResponse response, UUID userId) { - generateTokensOnLoginUseCase.generateAuthTokensAndReturnAccessToken( - userId, UserRole.getOAuthUserDefaultRole()); + private void processToken(HttpServletResponse response, UserIdentity userIdentity) { + generateTokensOnLoginUseCase.generateAuthTokensAndReturnAccessToken(userIdentity); - EncodedToken loginToken = - generateTokensOnLoginUseCase.generateLoginToken( - userId, UserRole.getOAuthUserDefaultRole()); + EncodedToken loginToken = generateTokensOnLoginUseCase.generateLoginToken(userIdentity); cookieUseCase.setToken(response, loginToken.value(), TokenType.SIGN_IN); } diff --git a/src/main/java/com/somemore/global/auth/oauth/service/CustomOAuth2UserService.java b/src/main/java/com/somemore/global/auth/oauth/service/CustomOAuth2UserService.java index d3212c59f..d0a37113c 100644 --- a/src/main/java/com/somemore/global/auth/oauth/service/CustomOAuth2UserService.java +++ b/src/main/java/com/somemore/global/auth/oauth/service/CustomOAuth2UserService.java @@ -36,6 +36,7 @@ private OAuth2User extractOAuth2User(OAuth2UserRequest userRequest) { } private OAuthProvider extractOAuthProvider(OAuth2UserRequest userRequest) { - return OAuthProvider.from(userRequest.getClientRegistration().getRegistrationId()); + String providerName = userRequest.getClientRegistration().getRegistrationId(); + return OAuthProvider.from(providerName); } } diff --git a/src/main/java/com/somemore/global/config/WebConfig.java b/src/main/java/com/somemore/global/config/WebConfig.java index 2a3d55e0b..d90545a04 100644 --- a/src/main/java/com/somemore/global/config/WebConfig.java +++ b/src/main/java/com/somemore/global/config/WebConfig.java @@ -1,12 +1,22 @@ package com.somemore.global.config; +import com.somemore.global.auth.annotation.RoleIdArgumentResolver; +import com.somemore.global.auth.annotation.UserIdArgumentResolver; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import java.util.List; + @Configuration +@RequiredArgsConstructor public class WebConfig implements WebMvcConfigurer { + private final UserIdArgumentResolver userIdArgumentResolver; + private final RoleIdArgumentResolver roleIdArgumentResolver; + @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") @@ -22,4 +32,10 @@ public void addCorsMappings(CorsRegistry registry) { .allowCredentials(true) .maxAge(3600); } + + @Override + public void addArgumentResolvers(List resolvers) { + resolvers.add(userIdArgumentResolver); + resolvers.add(roleIdArgumentResolver); + } } diff --git a/src/main/java/com/somemore/global/exception/ExceptionMessage.java b/src/main/java/com/somemore/global/exception/ExceptionMessage.java index 8d11e1899..4d314607d 100644 --- a/src/main/java/com/somemore/global/exception/ExceptionMessage.java +++ b/src/main/java/com/somemore/global/exception/ExceptionMessage.java @@ -69,6 +69,10 @@ public enum ExceptionMessage { // NOTE NOT_EXISTS_NOTE("존재하지 않는 쪽지입니다."), + // AUTH + AUTHENTICATION_MISSING("사용자가 인증되지 않았습니다."), + INVALID_PRINCIPAL_TYPE("인증 객체 타입이 올바르지 않습니다."), + // VOLUNTEER RECORD NOT_EXISTS_VOLUNTEER_RANKING("랭킹 정보가 존재하지 않습니다.") diff --git a/src/main/java/com/somemore/global/exception/InvalidAuthenticationException.java b/src/main/java/com/somemore/global/exception/InvalidAuthenticationException.java new file mode 100644 index 000000000..3f9f603af --- /dev/null +++ b/src/main/java/com/somemore/global/exception/InvalidAuthenticationException.java @@ -0,0 +1,22 @@ +package com.somemore.global.exception; + +import org.springframework.security.core.AuthenticationException; + +public class InvalidAuthenticationException extends AuthenticationException { + + public InvalidAuthenticationException(final String message) { + super(message); + } + + public InvalidAuthenticationException(final String message, final Throwable cause) { + super(message, cause); + } + + public InvalidAuthenticationException(final ExceptionMessage message) { + super(message.getMessage()); + } + + public InvalidAuthenticationException(final ExceptionMessage message, final Throwable cause) { + super(message.getMessage(), cause); + } +} diff --git a/src/main/java/com/somemore/global/exception/handler/GlobalExceptionHandler.java b/src/main/java/com/somemore/global/exception/handler/GlobalExceptionHandler.java index ce29c81d4..44b50bdaf 100644 --- a/src/main/java/com/somemore/global/exception/handler/GlobalExceptionHandler.java +++ b/src/main/java/com/somemore/global/exception/handler/GlobalExceptionHandler.java @@ -3,7 +3,9 @@ import com.somemore.global.exception.BadRequestException; import com.somemore.global.exception.DuplicateException; import com.somemore.global.exception.ImageUploadException; +import com.somemore.global.exception.InvalidAuthenticationException; import com.somemore.global.exception.NoSuchElementException; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ProblemDetail; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -11,6 +13,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice +@Slf4j public class GlobalExceptionHandler { //예시 코드 @@ -66,4 +69,16 @@ ProblemDetail handleNoSuchElementException(final NoSuchElementException e) { return problemDetail; } + @ExceptionHandler(InvalidAuthenticationException.class) + ProblemDetail handleInvalidAuthenticationException(InvalidAuthenticationException e) { + + ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, e.getMessage()); + problemDetail.setTitle("인증 문제"); + problemDetail.setDetail("인증에 문제가 발생했습니다."); + + log.warn("InvalidAuthenticationException: {}", e.getMessage()); + + return problemDetail; + } + } diff --git a/src/main/java/com/somemore/volunteer/service/NEWVolunteerQueryService.java b/src/main/java/com/somemore/volunteer/service/NEWVolunteerQueryService.java new file mode 100644 index 000000000..ad4a10218 --- /dev/null +++ b/src/main/java/com/somemore/volunteer/service/NEWVolunteerQueryService.java @@ -0,0 +1,31 @@ +package com.somemore.volunteer.service; + +import com.somemore.global.exception.ExceptionMessage; +import com.somemore.global.exception.NoSuchElementException; +import com.somemore.volunteer.domain.NEWVolunteer; +import com.somemore.volunteer.repository.NEWVolunteerRepository; +import com.somemore.volunteer.usecase.NEWVolunteerQueryUseCase; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class NEWVolunteerQueryService implements NEWVolunteerQueryUseCase { + + private final NEWVolunteerRepository volunteerRepository; + + @Override + public NEWVolunteer getByUserId(UUID userId) { + return volunteerRepository.findByUserId(userId) + .orElseThrow(() -> new NoSuchElementException(ExceptionMessage.NOT_EXISTS_VOLUNTEER)); + } + + @Override + public UUID getIdByUserId(UUID userId) { + return getByUserId(userId).getId(); + } +} diff --git a/src/main/java/com/somemore/volunteer/usecase/NEWVolunteerQueryUseCase.java b/src/main/java/com/somemore/volunteer/usecase/NEWVolunteerQueryUseCase.java new file mode 100644 index 000000000..1a3730b04 --- /dev/null +++ b/src/main/java/com/somemore/volunteer/usecase/NEWVolunteerQueryUseCase.java @@ -0,0 +1,12 @@ +package com.somemore.volunteer.usecase; + +import com.somemore.volunteer.domain.NEWVolunteer; + +import java.util.UUID; + +public interface NEWVolunteerQueryUseCase { + + NEWVolunteer getByUserId(UUID userId); + + UUID getIdByUserId(UUID userId); +} diff --git a/src/test/java/com/somemore/center/service/NEWCenterQueryServiceTest.java b/src/test/java/com/somemore/center/service/NEWCenterQueryServiceTest.java new file mode 100644 index 000000000..e388f43c3 --- /dev/null +++ b/src/test/java/com/somemore/center/service/NEWCenterQueryServiceTest.java @@ -0,0 +1,50 @@ +package com.somemore.center.service; + +import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.NEWCenterRepository; +import com.somemore.support.IntegrationTestSupport; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; + +@Transactional +class NEWCenterQueryServiceTest extends IntegrationTestSupport{ + + @Autowired + private NEWCenterQueryService centerQueryService; + + @Autowired + private NEWCenterRepository centerRepository; + + UUID userId; + NEWCenter center; + + @BeforeEach + void setUp() { + userId = UUID.randomUUID(); + center = NEWCenter.createDefault(userId); + centerRepository.save(center); + } + + @Test + @DisplayName("사용자 ID로 기관을 조회한다") + void getByUserId() { + NEWCenter foundCenter = centerQueryService.getByUserId(userId); + + assertThat(foundCenter).isEqualTo(center); + } + + @Test + @DisplayName("사용자 ID로 기관 ID를 조회한다") + void getIdByUserId() { + UUID foundCenterId = centerQueryService.getIdByUserId(userId); + + assertThat(foundCenterId).isEqualTo(center.getId()); + } +} diff --git a/src/test/java/com/somemore/global/auth/jwt/service/JwtServiceTest.java b/src/test/java/com/somemore/global/auth/jwt/service/JwtServiceTest.java index 393bc3e13..086247c97 100644 --- a/src/test/java/com/somemore/global/auth/jwt/service/JwtServiceTest.java +++ b/src/test/java/com/somemore/global/auth/jwt/service/JwtServiceTest.java @@ -1,5 +1,6 @@ package com.somemore.global.auth.jwt.service; +import com.somemore.global.auth.authentication.UserIdentity; import com.somemore.global.auth.jwt.domain.EncodedToken; import com.somemore.global.auth.jwt.domain.RefreshToken; import com.somemore.global.auth.jwt.domain.TokenType; @@ -17,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.transaction.annotation.Transactional; import javax.crypto.SecretKey; import java.time.Instant; @@ -26,7 +28,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; - +@Transactional class JwtServiceTest extends IntegrationTestSupport { @Autowired @@ -40,6 +42,11 @@ class JwtServiceTest extends IntegrationTestSupport { @Autowired private RedisTemplate redisTemplate; + private final UUID userId = UUID.randomUUID(); + private final UUID roleId = UUID.randomUUID(); + private final UserRole role = UserRole.VOLUNTEER; + private final UserIdentity userIdentity = UserIdentity.of(userId, roleId, role);; + @AfterEach void tearDown() { redisTemplate.keys("*") @@ -50,16 +57,14 @@ void tearDown() { @Test void generateAndValidateAccessToken() { // given - String userId = UUID.randomUUID().toString(); - UserRole role = UserRole.VOLUNTEER; - TokenType tokenType = TokenType.ACCESS; // when - EncodedToken token = jwtService.generateToken(userId, role.getAuthority(), tokenType); + EncodedToken token = jwtService.generateToken(userIdentity, TokenType.ACCESS); // then Claims claims = jwtService.getClaims(token); - assertThat(claims.get("id", String.class)).isEqualTo(userId); + assertThat(claims.get("userId", String.class)).isEqualTo(userId.toString()); + assertThat(claims.get("roleId", String.class)).isEqualTo(roleId.toString()); assertThat(claims.get("role", String.class)).isEqualTo(role.getAuthority()); assertThat(claims.getExpiration()).isNotNull(); } @@ -68,16 +73,14 @@ void generateAndValidateAccessToken() { @Test void generateAndValidateLoginToken() { // given - String userId = UUID.randomUUID().toString(); - UserRole role = UserRole.VOLUNTEER; - TokenType tokenType = TokenType.ACCESS; // when - EncodedToken token = jwtService.generateToken(userId, role.getAuthority(), tokenType); + EncodedToken token = jwtService.generateToken(userIdentity, TokenType.SIGN_IN); // then Claims claims = jwtService.getClaims(token); - assertThat(claims.get("id", String.class)).isEqualTo(userId); + assertThat(claims.get("userId", String.class)).isEqualTo(userId.toString()); + assertThat(claims.get("roleId", String.class)).isEqualTo(roleId.toString()); assertThat(claims.get("role", String.class)).isEqualTo(role.getAuthority()); assertThat(claims.getExpiration()).isNotNull(); } @@ -86,12 +89,10 @@ void generateAndValidateLoginToken() { @Test void tokenExpirationPeriodIsExact() { // given - String userId = UUID.randomUUID().toString(); - UserRole role = UserRole.VOLUNTEER; // when - EncodedToken accessToken = jwtService.generateToken(userId, role.getAuthority(), TokenType.ACCESS); - EncodedToken refreshToken = jwtService.generateToken(userId, role.getAuthority(), TokenType.REFRESH); + EncodedToken accessToken = jwtService.generateToken(userIdentity, TokenType.ACCESS); + EncodedToken refreshToken = jwtService.generateToken(userIdentity, TokenType.REFRESH); // then Claims accessClaims = jwtService.getClaims(accessToken); @@ -108,12 +109,10 @@ void tokenExpirationPeriodIsExact() { @Test void multipleTokensForSameUserAreDifferent() { // given - String userId = UUID.randomUUID().toString(); - UserRole role = UserRole.VOLUNTEER; // when - EncodedToken token1 = jwtService.generateToken(userId, role.getAuthority(), TokenType.ACCESS); - EncodedToken token2 = jwtService.generateToken(userId, role.getAuthority(), TokenType.ACCESS); + EncodedToken token1 = jwtService.generateToken(userIdentity, TokenType.ACCESS); + EncodedToken token2 = jwtService.generateToken(userIdentity, TokenType.ACCESS); // then assertThat(token1.value()).isNotEqualTo(token2.value()); @@ -123,12 +122,10 @@ void multipleTokensForSameUserAreDifferent() { @Test void throwExceptionWhenRefreshTokenIsInvalid() { // given - String userId = UUID.randomUUID().toString(); - UserRole role = UserRole.VOLUNTEER; - EncodedToken expiredAccessToken = createExpiredToken(userId, role); + EncodedToken expiredAccessToken = createExpiredToken(userId.toString(), role); + EncodedToken expiredRefreshToken = createExpiredToken(userId.toString(), role); - EncodedToken expiredRefreshToken = createExpiredToken(userId, role); - RefreshToken refreshToken = new RefreshToken(userId, expiredAccessToken, expiredRefreshToken); + RefreshToken refreshToken = new RefreshToken(userId.toString(), expiredAccessToken, expiredRefreshToken); tokenManager.save(refreshToken); // when @@ -167,7 +164,7 @@ void refreshTokenIsUpdated() { EncodedToken expiredAccessToken = createExpiredToken(userId, role); RefreshToken oldRefreshToken = createAndSaveRefreshToken(userId, expiredAccessToken, Instant.now().plusMillis(TokenType.REFRESH.getPeriodInMillis())); - EncodedToken newAccessToken = jwtService.generateToken(userId, role.getAuthority(), TokenType.ACCESS); + EncodedToken newAccessToken = jwtService.generateToken(userIdentity, TokenType.ACCESS); RefreshToken newRefreshToken = createAndSaveRefreshToken(userId, newAccessToken, Instant.now().plusMillis(TokenType.REFRESH.getPeriodInMillis())); // when diff --git a/src/test/java/com/somemore/global/auth/sign/SignOutVolunteerServiceTest.java b/src/test/java/com/somemore/global/auth/sign/SignOutVolunteerServiceTest.java index 625291c77..7d42a32ec 100644 --- a/src/test/java/com/somemore/global/auth/sign/SignOutVolunteerServiceTest.java +++ b/src/test/java/com/somemore/global/auth/sign/SignOutVolunteerServiceTest.java @@ -1,5 +1,6 @@ package com.somemore.global.auth.sign; +import com.somemore.global.auth.authentication.UserIdentity; import com.somemore.global.auth.jwt.domain.EncodedToken; import com.somemore.global.auth.jwt.domain.TokenType; import com.somemore.global.auth.jwt.exception.JwtErrorType; @@ -17,12 +18,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.transaction.annotation.Transactional; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThatNoException; import static org.assertj.core.api.Assertions.assertThatThrownBy; +@Transactional class SignOutServiceTest extends IntegrationTestSupport { @Autowired @@ -35,15 +38,15 @@ class SignOutServiceTest extends IntegrationTestSupport { private RedisTemplate redisTemplate; private MockHttpServletResponse response; - private UUID userId; - private UserRole role; + private final UUID userId = UUID.randomUUID(); + private final UUID roleId = UUID.randomUUID(); + private final UserRole role = UserRole.VOLUNTEER; + private final UserIdentity userIdentity = UserIdentity.of(userId, roleId, role);; @BeforeEach void setUp() { response = new MockHttpServletResponse(); - userId = UUID.randomUUID(); - role = UserRole.VOLUNTEER; } @AfterEach @@ -53,15 +56,15 @@ void tearDown() { } @Test - @DisplayName("로그아웃 시 액세스 토큰 쿠키를 삭제하고 리프레시 토큰을 제거해야 한다.") + @DisplayName("로그아웃 시 리프레시 토큰을 제거해야 한다.") void signOutDeletesTokens() { // Given - EncodedToken accessToken = jwtGenerator.generateToken(userId.toString(), role.getAuthority(), TokenType.ACCESS); + EncodedToken accessToken = jwtGenerator.generateToken(userIdentity, TokenType.ACCESS); RefreshToken refreshToken = new RefreshToken( userId.toString(), accessToken, - jwtGenerator.generateToken(userId.toString(), role.getAuthority(), TokenType.REFRESH)); + jwtGenerator.generateToken(userIdentity, TokenType.REFRESH)); tokenManager.save(refreshToken); diff --git a/src/test/java/com/somemore/volunteer/service/NEWVolunteerQueryServiceTest.java b/src/test/java/com/somemore/volunteer/service/NEWVolunteerQueryServiceTest.java new file mode 100644 index 000000000..5c12de054 --- /dev/null +++ b/src/test/java/com/somemore/volunteer/service/NEWVolunteerQueryServiceTest.java @@ -0,0 +1,50 @@ +package com.somemore.volunteer.service; + +import com.somemore.support.IntegrationTestSupport; +import com.somemore.volunteer.domain.NEWVolunteer; +import com.somemore.volunteer.repository.NEWVolunteerRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; + +@Transactional +class NEWVolunteerQueryServiceTest extends IntegrationTestSupport { + + @Autowired + private NEWVolunteerQueryService volunteerQueryService; + + @Autowired + private NEWVolunteerRepository volunteerRepository; + + UUID userId; + NEWVolunteer volunteer; + + @BeforeEach + void setUp() { + userId = UUID.randomUUID(); + volunteer = NEWVolunteer.createDefault(userId); + volunteerRepository.save(volunteer); + } + + @Test + @DisplayName("사용자 ID로 봉사자를 조회한다") + void getByUserId() { + NEWVolunteer foundVolunteer = volunteerQueryService.getByUserId(userId); + + assertThat(foundVolunteer).isEqualTo(volunteer); + } + + @Test + @DisplayName("사용자 ID로 봉사자 ID를 조회한다") + void getIdByUserId() { + UUID foundVolunteerId = volunteerQueryService.getIdByUserId(userId); + + assertThat(foundVolunteerId).isEqualTo(volunteer.getId()); + } +} \ No newline at end of file