generated from pricelees/issue-pr-template
refactor: 인터셉터 코틀린 전환 및 클래스 통합
This commit is contained in:
parent
8371559978
commit
61ac2f15bf
@ -1,85 +0,0 @@
|
|||||||
package roomescape.system.auth.web.support;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import org.springframework.web.method.HandlerMethod;
|
|
||||||
import org.springframework.web.servlet.HandlerInterceptor;
|
|
||||||
|
|
||||||
import jakarta.servlet.http.Cookie;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
import roomescape.member.business.MemberService;
|
|
||||||
import roomescape.member.infrastructure.persistence.Member;
|
|
||||||
import roomescape.system.auth.infrastructure.jwt.JwtHandler;
|
|
||||||
import roomescape.system.exception.ErrorType;
|
|
||||||
import roomescape.system.exception.RoomEscapeException;
|
|
||||||
|
|
||||||
@Component
|
|
||||||
public class AdminInterceptor implements HandlerInterceptor {
|
|
||||||
|
|
||||||
private static final String ACCESS_TOKEN_COOKIE_NAME = "accessToken";
|
|
||||||
private final MemberService memberService;
|
|
||||||
private final JwtHandler jwtHandler;
|
|
||||||
|
|
||||||
public AdminInterceptor(MemberService memberService, JwtHandler jwtHandler) {
|
|
||||||
this.memberService = memberService;
|
|
||||||
this.jwtHandler = jwtHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean preHandle(
|
|
||||||
HttpServletRequest request,
|
|
||||||
HttpServletResponse response,
|
|
||||||
Object handler
|
|
||||||
)
|
|
||||||
throws Exception {
|
|
||||||
if (isHandlerIrrelevantWithAdmin(handler)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Member member;
|
|
||||||
try {
|
|
||||||
Cookie token = getToken(request);
|
|
||||||
Long memberId = jwtHandler.getMemberIdFromToken(token.getValue());
|
|
||||||
member = memberService.findById(memberId);
|
|
||||||
} catch (RoomEscapeException e) {
|
|
||||||
response.sendRedirect("/login");
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (member.isAdmin()) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
response.sendRedirect("/login");
|
|
||||||
throw new RoomEscapeException(ErrorType.PERMISSION_DOES_NOT_EXIST,
|
|
||||||
String.format("[memberId: %d, Role: %s]", member.getId(), member.getRole()), HttpStatus.FORBIDDEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Cookie getToken(HttpServletRequest request) {
|
|
||||||
validateCookieHeader(request);
|
|
||||||
|
|
||||||
Cookie[] cookies = request.getCookies();
|
|
||||||
return Arrays.stream(cookies)
|
|
||||||
.filter(cookie -> cookie.getName().equals(ACCESS_TOKEN_COOKIE_NAME))
|
|
||||||
.findAny()
|
|
||||||
.orElseThrow(() -> new RoomEscapeException(ErrorType.INVALID_TOKEN, HttpStatus.UNAUTHORIZED));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void validateCookieHeader(HttpServletRequest request) {
|
|
||||||
String cookieHeader = request.getHeader("Cookie");
|
|
||||||
if (cookieHeader == null) {
|
|
||||||
throw new RoomEscapeException(ErrorType.NOT_EXIST_COOKIE, HttpStatus.UNAUTHORIZED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isHandlerIrrelevantWithAdmin(Object handler) {
|
|
||||||
if (!(handler instanceof HandlerMethod handlerMethod)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
Admin adminAnnotation = handlerMethod.getMethodAnnotation(Admin.class);
|
|
||||||
return adminAnnotation == null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,90 @@
|
|||||||
|
package roomescape.system.auth.web.support
|
||||||
|
|
||||||
|
import jakarta.servlet.http.HttpServletRequest
|
||||||
|
import jakarta.servlet.http.HttpServletResponse
|
||||||
|
import org.springframework.http.HttpStatus
|
||||||
|
import org.springframework.stereotype.Component
|
||||||
|
import org.springframework.web.method.HandlerMethod
|
||||||
|
import org.springframework.web.servlet.HandlerInterceptor
|
||||||
|
import roomescape.member.business.MemberService
|
||||||
|
import roomescape.member.infrastructure.persistence.Member
|
||||||
|
import roomescape.system.auth.infrastructure.jwt.JwtHandler
|
||||||
|
import roomescape.system.exception.ErrorType
|
||||||
|
import roomescape.system.exception.RoomEscapeException
|
||||||
|
|
||||||
|
private fun Any.isIrrelevantWith(annotationType: Class<out Annotation>): Boolean {
|
||||||
|
if (this !is HandlerMethod) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return !this.hasMethodAnnotation(annotationType)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Component
|
||||||
|
class LoginInterceptor(
|
||||||
|
private val memberService: MemberService,
|
||||||
|
private val jwtHandler: JwtHandler
|
||||||
|
) : HandlerInterceptor {
|
||||||
|
|
||||||
|
@Throws(Exception::class)
|
||||||
|
override fun preHandle(
|
||||||
|
request: HttpServletRequest,
|
||||||
|
response: HttpServletResponse,
|
||||||
|
handler: Any
|
||||||
|
): Boolean {
|
||||||
|
if (handler.isIrrelevantWith(LoginRequired::class.java)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
val token: String? = request.accessTokenCookie().value
|
||||||
|
val memberId: Long = jwtHandler.getMemberIdFromToken(token)
|
||||||
|
|
||||||
|
return memberService.existsById(memberId)
|
||||||
|
} catch (e: RoomEscapeException) {
|
||||||
|
response.sendRedirect("/login")
|
||||||
|
throw RoomEscapeException(ErrorType.LOGIN_REQUIRED, HttpStatus.FORBIDDEN)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Component
|
||||||
|
class AdminInterceptor(
|
||||||
|
private val memberService: MemberService,
|
||||||
|
private val jwtHandler: JwtHandler
|
||||||
|
) : HandlerInterceptor {
|
||||||
|
|
||||||
|
@Throws(Exception::class)
|
||||||
|
override fun preHandle(
|
||||||
|
request: HttpServletRequest,
|
||||||
|
response: HttpServletResponse,
|
||||||
|
handler: Any
|
||||||
|
): Boolean {
|
||||||
|
if (handler.isIrrelevantWith(Admin::class.java)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
val member: Member?
|
||||||
|
|
||||||
|
try {
|
||||||
|
val token: String? = request.accessTokenCookie().value
|
||||||
|
val memberId: Long = jwtHandler.getMemberIdFromToken(token)
|
||||||
|
member = memberService.findById(memberId)
|
||||||
|
} catch (e: RoomEscapeException) {
|
||||||
|
response.sendRedirect("/login")
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
|
||||||
|
with(member) {
|
||||||
|
if (this.isAdmin()) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
response.sendRedirect("/login")
|
||||||
|
throw RoomEscapeException(
|
||||||
|
ErrorType.PERMISSION_DOES_NOT_EXIST,
|
||||||
|
String.format("[memberId: %d, Role: %s]", this.id, this.role),
|
||||||
|
HttpStatus.FORBIDDEN
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,78 +0,0 @@
|
|||||||
package roomescape.system.auth.web.support;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import org.springframework.web.method.HandlerMethod;
|
|
||||||
import org.springframework.web.servlet.HandlerInterceptor;
|
|
||||||
|
|
||||||
import jakarta.servlet.http.Cookie;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
import roomescape.member.business.MemberService;
|
|
||||||
import roomescape.member.infrastructure.persistence.Member;
|
|
||||||
import roomescape.system.auth.infrastructure.jwt.JwtHandler;
|
|
||||||
import roomescape.system.exception.ErrorType;
|
|
||||||
import roomescape.system.exception.RoomEscapeException;
|
|
||||||
|
|
||||||
@Component
|
|
||||||
public class LoginInterceptor implements HandlerInterceptor {
|
|
||||||
|
|
||||||
private static final String ACCESS_TOKEN_COOKIE_NAME = "accessToken";
|
|
||||||
private final MemberService memberService;
|
|
||||||
private final JwtHandler jwtHandler;
|
|
||||||
|
|
||||||
public LoginInterceptor(MemberService memberService, JwtHandler jwtHandler) {
|
|
||||||
this.memberService = memberService;
|
|
||||||
this.jwtHandler = jwtHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean preHandle(
|
|
||||||
HttpServletRequest request,
|
|
||||||
HttpServletResponse response,
|
|
||||||
Object handler
|
|
||||||
)
|
|
||||||
throws Exception {
|
|
||||||
if (isHandlerIrrelevantWithLoginRequired(handler)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Member member;
|
|
||||||
try {
|
|
||||||
Cookie token = getToken(request);
|
|
||||||
Long memberId = jwtHandler.getMemberIdFromToken(token.getValue());
|
|
||||||
member = memberService.findById(memberId);
|
|
||||||
return member != null;
|
|
||||||
} catch (RoomEscapeException e) {
|
|
||||||
response.sendRedirect("/login");
|
|
||||||
throw new RoomEscapeException(ErrorType.LOGIN_REQUIRED, HttpStatus.FORBIDDEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Cookie getToken(HttpServletRequest request) {
|
|
||||||
validateCookieHeader(request);
|
|
||||||
|
|
||||||
Cookie[] cookies = request.getCookies();
|
|
||||||
return Arrays.stream(cookies)
|
|
||||||
.filter(cookie -> cookie.getName().equals(ACCESS_TOKEN_COOKIE_NAME))
|
|
||||||
.findAny()
|
|
||||||
.orElseThrow(() -> new RoomEscapeException(ErrorType.INVALID_TOKEN, HttpStatus.UNAUTHORIZED));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void validateCookieHeader(HttpServletRequest request) {
|
|
||||||
String cookieHeader = request.getHeader("Cookie");
|
|
||||||
if (cookieHeader == null) {
|
|
||||||
throw new RoomEscapeException(ErrorType.NOT_EXIST_COOKIE, HttpStatus.UNAUTHORIZED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isHandlerIrrelevantWithLoginRequired(Object handler) {
|
|
||||||
if (!(handler instanceof HandlerMethod handlerMethod)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
LoginRequired loginRequiredAnnotation = handlerMethod.getMethodAnnotation(LoginRequired.class);
|
|
||||||
return loginRequiredAnnotation == null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
x
Reference in New Issue
Block a user