diff --git a/src/main/java/com/dev/moim/global/security/annotation/resolver/AuthUserMoimAdminArgumentResolver.java b/src/main/java/com/dev/moim/global/security/annotation/resolver/AuthUserMoimAdminArgumentResolver.java index a20ab73a..aa59dcc0 100644 --- a/src/main/java/com/dev/moim/global/security/annotation/resolver/AuthUserMoimAdminArgumentResolver.java +++ b/src/main/java/com/dev/moim/global/security/annotation/resolver/AuthUserMoimAdminArgumentResolver.java @@ -7,6 +7,7 @@ import com.dev.moim.global.error.handler.AuthException; import com.dev.moim.global.redis.util.RedisUtil; import com.dev.moim.global.security.annotation.annotation.AuthUserMoimAdmin; +import com.dev.moim.global.security.principal.MoimAuthentication; import com.dev.moim.global.security.util.JwtUtil; import jakarta.annotation.Nonnull; import jakarta.servlet.http.HttpServletRequest; @@ -58,11 +59,14 @@ public Object resolveArgument( .map(authentication -> { String userId = authentication.getName(); Long moimId = extractMoimIdFromUri(httpServletRequest.getRequestURI()); - List moimRoleList = new ArrayList<>(Arrays.asList(MoimRole.OWNER, MoimRole.ADMIN)); + UserMoim userMoimAdmin = userMoimQueryService.findByUserIdAndMoimIdAndJoinStatusInMoimRoleListWithUserAndMoim( - Long.valueOf(userId), moimId, JoinStatus.COMPLETE, moimRoleList) + Long.valueOf(userId), moimId, JoinStatus.COMPLETE, Arrays.asList(MoimRole.OWNER, MoimRole.ADMIN)) .orElseThrow(() -> new AuthException(USER_NOT_MOIM_ADMIN)); + SecurityContextHolder.getContext().setAuthentication( + new MoimAuthentication(authentication, moimId, userMoimAdmin.getMoimRole(), userMoimAdmin.getId())); + if (userMoimAdmin.getUser().getDeviceId() == null) { Long now = new Date().getTime(); Long expiration = jwtUtil.getExpiration(accessToken) - now; diff --git a/src/main/java/com/dev/moim/global/security/annotation/resolver/AuthUserMoimArgumentResolver.java b/src/main/java/com/dev/moim/global/security/annotation/resolver/AuthUserMoimArgumentResolver.java index f2145e0a..d40912b9 100644 --- a/src/main/java/com/dev/moim/global/security/annotation/resolver/AuthUserMoimArgumentResolver.java +++ b/src/main/java/com/dev/moim/global/security/annotation/resolver/AuthUserMoimArgumentResolver.java @@ -6,6 +6,7 @@ import com.dev.moim.global.error.handler.AuthException; import com.dev.moim.global.redis.util.RedisUtil; import com.dev.moim.global.security.annotation.annotation.AuthUserMoim; +import com.dev.moim.global.security.principal.MoimAuthentication; import com.dev.moim.global.security.util.JwtUtil; import jakarta.annotation.Nonnull; import jakarta.servlet.http.HttpServletRequest; @@ -60,10 +61,14 @@ public Object resolveArgument( .map(authentication -> { String userId = authentication.getName(); Long moimId = extractMoimIdFromUri(httpServletRequest.getRequestURI()); + UserMoim userMoim = userMoimQueryService.findByUserIdAndMoimIdAndJoinStatusWithUserAndMoim( Long.valueOf(userId), moimId, JoinStatus.COMPLETE) .orElseThrow(() -> new AuthException(USER_NOT_MOIM_JOIN)); + SecurityContextHolder.getContext().setAuthentication( + new MoimAuthentication(authentication, moimId, userMoim.getMoimRole(), userMoim.getId())); + if (userMoim.getUser().getDeviceId() == null) { Long now = new Date().getTime(); Long expiration = jwtUtil.getExpiration(accessToken) - now; diff --git a/src/main/java/com/dev/moim/global/security/annotation/resolver/AuthUserMoimOwnerArgumentResolver.java b/src/main/java/com/dev/moim/global/security/annotation/resolver/AuthUserMoimOwnerArgumentResolver.java index c4dbb6c4..2d70c29a 100644 --- a/src/main/java/com/dev/moim/global/security/annotation/resolver/AuthUserMoimOwnerArgumentResolver.java +++ b/src/main/java/com/dev/moim/global/security/annotation/resolver/AuthUserMoimOwnerArgumentResolver.java @@ -7,6 +7,7 @@ import com.dev.moim.global.error.handler.AuthException; import com.dev.moim.global.redis.util.RedisUtil; import com.dev.moim.global.security.annotation.annotation.AuthUserMoimAdmin; +import com.dev.moim.global.security.principal.MoimAuthentication; import com.dev.moim.global.security.util.JwtUtil; import jakarta.annotation.Nonnull; import jakarta.servlet.http.HttpServletRequest; @@ -61,11 +62,15 @@ public Object resolveArgument( .map(authentication -> { String userId = authentication.getName(); Long moimId = extractMoimIdFromUri(httpServletRequest.getRequestURI()); - UserMoim userMoim = userMoimQueryService.findByUserIdAndMoimIdAndJoinStatusAndMoimRoleWithUserAndMoim( + + UserMoim userMoimOwner = userMoimQueryService.findByUserIdAndMoimIdAndJoinStatusAndMoimRoleWithUserAndMoim( Long.valueOf(userId), moimId, JoinStatus.COMPLETE, MoimRole.OWNER) .orElseThrow(() -> new AuthException(USER_NOT_MOIM_OWNER)); - if (userMoim.getUser().getDeviceId() == null) { + SecurityContextHolder.getContext().setAuthentication( + new MoimAuthentication(authentication, moimId, userMoimOwner.getMoimRole(), userMoimOwner.getId())); + + if (userMoimOwner.getUser().getDeviceId() == null) { Long now = new Date().getTime(); Long expiration = jwtUtil.getExpiration(accessToken) - now; redisUtil.setValue(accessToken, "deviceId_missing", expiration); @@ -73,7 +78,7 @@ public Object resolveArgument( throw new AuthException(FCM_TOKEN_REQUIRED); } - return userMoim; + return userMoimOwner; }).orElseThrow(() -> new AuthException(AUTH_INVALID_TOKEN)); } diff --git a/src/main/java/com/dev/moim/global/security/principal/MoimAuthentication.java b/src/main/java/com/dev/moim/global/security/principal/MoimAuthentication.java new file mode 100644 index 00000000..e91109f5 --- /dev/null +++ b/src/main/java/com/dev/moim/global/security/principal/MoimAuthentication.java @@ -0,0 +1,49 @@ +package com.dev.moim.global.security.principal; + +import com.dev.moim.domain.moim.entity.enums.MoimRole; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; + +import java.util.Collection; + +public record MoimAuthentication( + Authentication originalAuthentication, + Long moimId, + MoimRole moimRole, + Long userMoimId) implements Authentication { + + @Override + public Collection getAuthorities() { + return originalAuthentication.getAuthorities(); + } + + @Override + public Object getCredentials() { + return originalAuthentication.getCredentials(); + } + + @Override + public Object getDetails() { + return originalAuthentication.getDetails(); + } + + @Override + public Object getPrincipal() { + return originalAuthentication.getPrincipal(); + } + + @Override + public boolean isAuthenticated() { + return originalAuthentication.isAuthenticated(); + } + + @Override + public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { + originalAuthentication.setAuthenticated(isAuthenticated); + } + + @Override + public String getName() { + return originalAuthentication.getName(); + } +}