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