Skip to content

Commit 0c91030

Browse files
authored
fix: RequiredArgsConstructor 동작하도록 임시 수정 (#410)
1 parent 66aa670 commit 0c91030

File tree

2 files changed

+51
-20
lines changed

2 files changed

+51
-20
lines changed
Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,71 @@
11
package com.example.solidconnection.security.aspect;
22

33
import static com.example.solidconnection.common.exception.ErrorCode.ACCESS_DENIED;
4+
import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND;
45

56
import com.example.solidconnection.common.exception.CustomException;
7+
import com.example.solidconnection.common.resolver.AuthorizedUser;
68
import com.example.solidconnection.security.annotation.RequireRoleAccess;
79
import com.example.solidconnection.siteuser.domain.Role;
810
import com.example.solidconnection.siteuser.domain.SiteUser;
11+
import com.example.solidconnection.siteuser.repository.SiteUserRepository;
12+
import java.lang.reflect.Parameter;
913
import java.util.Arrays;
1014
import lombok.RequiredArgsConstructor;
1115
import org.aspectj.lang.ProceedingJoinPoint;
1216
import org.aspectj.lang.annotation.Around;
1317
import org.aspectj.lang.annotation.Aspect;
18+
import org.aspectj.lang.reflect.MethodSignature;
1419
import org.springframework.stereotype.Component;
1520

1621
@Aspect
1722
@Component
1823
@RequiredArgsConstructor
1924
public class RoleAuthorizationAspect {
2025

21-
// todo: 추후 siteUserId로 파라미터 변경 시 수정 필요
26+
private final SiteUserRepository siteUserRepository;
27+
28+
// todo: 추후 개선 필요
2229
@Around("@annotation(requireRoleAccess)")
2330
public Object checkRoleAccess(ProceedingJoinPoint joinPoint, RequireRoleAccess requireRoleAccess) throws Throwable {
24-
SiteUser siteUser = null;
25-
for (Object arg : joinPoint.getArgs()) {
26-
if (arg instanceof SiteUser) {
27-
siteUser = (SiteUser) arg;
28-
break;
29-
}
30-
}
31-
if (siteUser == null) {
31+
32+
Long siteUserId = extractAuthorizedUserId(joinPoint);
33+
34+
if (siteUserId == null) {
3235
throw new CustomException(ACCESS_DENIED);
3336
}
34-
Role[] allowedRoles = requireRoleAccess.roles();
37+
38+
SiteUser siteUser = siteUserRepository.findById(siteUserId)
39+
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
40+
41+
validateUserRole(siteUser, requireRoleAccess.roles());
42+
43+
return joinPoint.proceed();
44+
}
45+
46+
private Long extractAuthorizedUserId(ProceedingJoinPoint joinPoint) {
47+
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
48+
Parameter[] parameters = signature.getMethod().getParameters();
49+
Object[] args = joinPoint.getArgs();
50+
51+
for (int i = 0; i < parameters.length; i++) {
52+
if (parameters[i].isAnnotationPresent(AuthorizedUser.class)) {
53+
Object arg = args[i];
54+
if (arg instanceof Long) {
55+
return (Long) arg;
56+
} else if (parameters[i].getType() == long.class) {
57+
return (Long) arg;
58+
}
59+
}
60+
}
61+
return null;
62+
}
63+
64+
private void validateUserRole(SiteUser siteUser, Role[] allowedRoles) {
3565
boolean hasAccess = Arrays.asList(allowedRoles).contains(siteUser.getRole());
66+
3667
if (!hasAccess) {
3768
throw new CustomException(ACCESS_DENIED);
3869
}
39-
return joinPoint.proceed();
4070
}
4171
}

src/test/java/com/example/solidconnection/security/aspect/RoleAuthorizationAspectTest.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static org.junit.jupiter.api.Assertions.assertAll;
66

77
import com.example.solidconnection.common.exception.CustomException;
8+
import com.example.solidconnection.common.resolver.AuthorizedUser;
89
import com.example.solidconnection.security.annotation.RequireRoleAccess;
910
import com.example.solidconnection.siteuser.domain.Role;
1011
import com.example.solidconnection.siteuser.domain.SiteUser;
@@ -35,9 +36,9 @@ class RoleAuthorizationAspectTest {
3536

3637
// when & then
3738
assertAll(
38-
() -> assertThatCode(() -> testService.adminOnlyMethod(admin))
39+
() -> assertThatCode(() -> testService.adminOnlyMethod(admin.getId()))
3940
.doesNotThrowAnyException(),
40-
() -> assertThatCode(() -> testService.mentorOrAdminMethod(mentor))
41+
() -> assertThatCode(() -> testService.mentorOrAdminMethod(mentor.getId()))
4142
.doesNotThrowAnyException()
4243
);
4344
}
@@ -48,7 +49,7 @@ class RoleAuthorizationAspectTest {
4849
SiteUser user = siteUserFixture.사용자();
4950

5051
// when & then
51-
assertThatCode(() -> testService.mentorOrAdminMethod(user))
52+
assertThatCode(() -> testService.mentorOrAdminMethod(user.getId()))
5253
.isInstanceOf(CustomException.class)
5354
.hasMessage(ACCESS_DENIED.getMessage());
5455
}
@@ -62,11 +63,11 @@ class RoleAuthorizationAspectTest {
6263

6364
// when & then
6465
assertAll(
65-
() -> assertThatCode(() -> testService.publicMethod(admin))
66+
() -> assertThatCode(() -> testService.publicMethod(admin.getId()))
6667
.doesNotThrowAnyException(),
67-
() -> assertThatCode(() -> testService.publicMethod(mentor))
68+
() -> assertThatCode(() -> testService.publicMethod(mentor.getId()))
6869
.doesNotThrowAnyException(),
69-
() -> assertThatCode(() -> testService.publicMethod(user))
70+
() -> assertThatCode(() -> testService.publicMethod(user.getId()))
7071
.doesNotThrowAnyException()
7172
);
7273
}
@@ -84,16 +85,16 @@ public TestService testService() {
8485
static class TestService {
8586

8687
@RequireRoleAccess(roles = {Role.ADMIN})
87-
public boolean adminOnlyMethod(SiteUser siteUser) {
88+
public boolean adminOnlyMethod(@AuthorizedUser long siteUserId) {
8889
return true;
8990
}
9091

9192
@RequireRoleAccess(roles = {Role.ADMIN, Role.MENTOR})
92-
public boolean mentorOrAdminMethod(SiteUser siteUser) {
93+
public boolean mentorOrAdminMethod(@AuthorizedUser long siteUserId) {
9394
return true;
9495
}
9596

96-
public boolean publicMethod(SiteUser siteUser) {
97+
public boolean publicMethod(@AuthorizedUser long siteUserId) {
9798
return true;
9899
}
99100
}

0 commit comments

Comments
 (0)