Skip to content

Commit 3d203c2

Browse files
committed
feat(annotation): userId, roleId 추출 어노테이션 추가
1 parent a5ed084 commit 3d203c2

File tree

4 files changed

+102
-0
lines changed

4 files changed

+102
-0
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.somemore.global.auth.annotation;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Retention(RetentionPolicy.RUNTIME)
9+
@Target(ElementType.PARAMETER)
10+
public @interface RoleId {
11+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.somemore.global.auth.annotation;
2+
3+
import com.somemore.global.auth.authentication.UserIdentity;
4+
import com.somemore.global.exception.InvalidAuthenticationException;
5+
import org.springframework.core.MethodParameter;
6+
import org.springframework.security.core.Authentication;
7+
import org.springframework.security.core.context.SecurityContextHolder;
8+
import org.springframework.stereotype.Component;
9+
import org.springframework.web.bind.support.WebDataBinderFactory;
10+
import org.springframework.web.context.request.NativeWebRequest;
11+
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
12+
import org.springframework.web.method.support.ModelAndViewContainer;
13+
14+
import static com.somemore.global.exception.ExceptionMessage.AUTHENTICATION_MISSING;
15+
import static com.somemore.global.exception.ExceptionMessage.INVALID_PRINCIPAL_TYPE;
16+
17+
@Component
18+
public class RoleIdArgumentResolver implements HandlerMethodArgumentResolver {
19+
20+
@Override
21+
public boolean supportsParameter(MethodParameter parameter) {
22+
return parameter.hasParameterAnnotation(RoleId.class);
23+
}
24+
25+
@Override
26+
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
27+
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
28+
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
29+
30+
if (authentication == null) {
31+
throw new InvalidAuthenticationException(AUTHENTICATION_MISSING);
32+
}
33+
34+
if (authentication.getPrincipal() instanceof UserIdentity principal) {
35+
return principal.roleId();
36+
}
37+
38+
throw new InvalidAuthenticationException(INVALID_PRINCIPAL_TYPE);
39+
}
40+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.somemore.global.auth.annotation;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Retention(RetentionPolicy.RUNTIME)
9+
@Target(ElementType.PARAMETER)
10+
public @interface UserId {
11+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.somemore.global.auth.annotation;
2+
3+
import com.somemore.global.auth.authentication.UserIdentity;
4+
import com.somemore.global.exception.InvalidAuthenticationException;
5+
import org.springframework.core.MethodParameter;
6+
import org.springframework.security.core.Authentication;
7+
import org.springframework.security.core.context.SecurityContextHolder;
8+
import org.springframework.stereotype.Component;
9+
import org.springframework.web.bind.support.WebDataBinderFactory;
10+
import org.springframework.web.context.request.NativeWebRequest;
11+
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
12+
import org.springframework.web.method.support.ModelAndViewContainer;
13+
14+
import static com.somemore.global.exception.ExceptionMessage.AUTHENTICATION_MISSING;
15+
import static com.somemore.global.exception.ExceptionMessage.INVALID_PRINCIPAL_TYPE;
16+
17+
@Component
18+
public class UserIdArgumentResolver implements HandlerMethodArgumentResolver {
19+
20+
@Override
21+
public boolean supportsParameter(MethodParameter parameter) {
22+
return parameter.hasParameterAnnotation(UserId.class);
23+
}
24+
25+
@Override
26+
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
27+
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
28+
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
29+
30+
if (authentication == null) {
31+
throw new InvalidAuthenticationException(AUTHENTICATION_MISSING);
32+
}
33+
34+
if (authentication.getPrincipal() instanceof UserIdentity principal) {
35+
return principal.userId();
36+
}
37+
38+
return new InvalidAuthenticationException(INVALID_PRINCIPAL_TYPE);
39+
}
40+
}

0 commit comments

Comments
 (0)