Skip to content

Commit 1b7a31e

Browse files
authored
Merge pull request #309 from JNU-econovation/feat/#308
[BE/feat] 익명 사용자일 경우 예외 처리
2 parents dbd08ff + c029c24 commit 1b7a31e

File tree

12 files changed

+95
-18
lines changed

12 files changed

+95
-18
lines changed

BE/exceed/src/main/java/com/gaebaljip/exceed/common/Encryption.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
import javax.crypto.spec.IvParameterSpec;
1414
import javax.crypto.spec.SecretKeySpec;
1515

16-
import com.gaebaljip.exceed.common.annotation.Timer;
1716
import org.springframework.beans.factory.annotation.Value;
1817
import org.springframework.stereotype.Component;
1918

19+
import com.gaebaljip.exceed.common.annotation.Timer;
2020
import com.gaebaljip.exceed.common.exception.DecryptionErrorException;
2121
import com.gaebaljip.exceed.common.exception.EncryptionErrorException;
2222

@@ -47,6 +47,7 @@ public String encrypt(String value) {
4747
throw EncryptionErrorException.EXECPTION;
4848
}
4949
}
50+
5051
@Timer
5152
public String decrypt(final String encryptedValue) {
5253
try {

BE/exceed/src/main/java/com/gaebaljip/exceed/common/exception/GlobalExceptionHandler.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@
1818
import com.gaebaljip.exceed.common.ApiResponse;
1919
import com.gaebaljip.exceed.common.ApiResponseGenerator;
2020
import com.gaebaljip.exceed.common.Error;
21-
import com.gaebaljip.exceed.security.exception.ExpiredJwtException;
22-
import com.gaebaljip.exceed.security.exception.InvalidJwtException;
23-
import com.gaebaljip.exceed.security.exception.SecurityErrorCode;
24-
import com.gaebaljip.exceed.security.exception.UnSupportedJwtException;
21+
import com.gaebaljip.exceed.security.exception.*;
2522

2623
import lombok.extern.slf4j.Slf4j;
2724

@@ -32,21 +29,33 @@ public class GlobalExceptionHandler {
3229
@ExceptionHandler(ExpiredJwtException.class)
3330
protected ApiResponse<?> handleExpiredJwtAuthenticationException(ExpiredJwtException e) {
3431
return ApiResponseGenerator.fail(
35-
SecurityErrorCode.EXPIRED_JWT.getCode(), e.getMessage(), HttpStatus.UNAUTHORIZED);
32+
SecurityErrorCode.EXPIRED_JWT.getCode(),
33+
SecurityErrorCode.EXPIRED_JWT.getReason(),
34+
HttpStatus.UNAUTHORIZED);
3635
}
3736

3837
@ExceptionHandler(UnSupportedJwtException.class)
3938
protected ApiResponse<?> handleUnsupportedJwtException(UnSupportedJwtException e) {
4039
return ApiResponseGenerator.fail(
4140
SecurityErrorCode.UNSUPPORTED_JWT.getCode(),
42-
e.getMessage(),
41+
SecurityErrorCode.UNSUPPORTED_JWT.getReason(),
4342
HttpStatus.UNAUTHORIZED);
4443
}
4544

4645
@ExceptionHandler(InvalidJwtException.class)
4746
protected ApiResponse<?> handleInvalidJwtException(InvalidJwtException e) {
4847
return ApiResponseGenerator.fail(
49-
SecurityErrorCode.INVALID_JWT.getCode(), e.getMessage(), HttpStatus.UNAUTHORIZED);
48+
SecurityErrorCode.INVALID_JWT.getCode(),
49+
SecurityErrorCode.UNSUPPORTED_JWT.getReason(),
50+
HttpStatus.UNAUTHORIZED);
51+
}
52+
53+
@ExceptionHandler(SignatureJwtException.class)
54+
protected ApiResponse<?> handleSignatureJwtException(SignatureJwtException e) {
55+
return ApiResponseGenerator.fail(
56+
SecurityErrorCode.SIGNATURE_JWT.getCode(),
57+
SecurityErrorCode.SIGNATURE_JWT.getReason(),
58+
HttpStatus.UNAUTHORIZED);
5059
}
5160

5261
@ExceptionHandler(HttpMessageNotReadableException.class)

BE/exceed/src/main/java/com/gaebaljip/exceed/common/log/LoggingFilter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
@Component
2020
@Slf4j
2121
public class LoggingFilter extends OncePerRequestFilter {
22-
private final List<String> excludeUrl = List.of("/actuator/health", "/actuator/prometheus");
22+
private final List<String> excludeUrl =
23+
List.of("/actuator/health", "/actuator/prometheus", "/v1/health");
2324

2425
@Override
2526
protected void doFilterInternal(

BE/exceed/src/main/java/com/gaebaljip/exceed/member/adapter/out/persistence/EmailAdapter.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.gaebaljip.exceed.member.adapter.out.persistence;
22

33
import org.springframework.beans.factory.annotation.Value;
4-
import org.springframework.scheduling.annotation.Async;
54
import org.springframework.stereotype.Component;
65
import org.thymeleaf.context.Context;
76
import org.thymeleaf.spring5.SpringTemplateEngine;

BE/exceed/src/main/java/com/gaebaljip/exceed/member/adapter/out/persistence/MemberPersistenceAdapter.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.time.LocalDateTime;
44
import java.util.Optional;
55

6-
import com.gaebaljip.exceed.common.annotation.Timer;
76
import org.springframework.stereotype.Component;
87

98
import com.gaebaljip.exceed.auth.exception.MemberNotCheckedException;

BE/exceed/src/main/java/com/gaebaljip/exceed/member/adapter/out/persistence/RedisAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
import java.util.Optional;
44

5-
import com.gaebaljip.exceed.common.annotation.Timer;
65
import org.springframework.stereotype.Component;
76

7+
import com.gaebaljip.exceed.common.annotation.Timer;
88
import com.gaebaljip.exceed.common.redis.RedisUtils;
99
import com.gaebaljip.exceed.member.application.port.out.TimeOutPort;
1010

BE/exceed/src/main/java/com/gaebaljip/exceed/member/application/CheckCodeService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.gaebaljip.exceed.member.application;
22

3-
import com.gaebaljip.exceed.common.annotation.Timer;
43
import org.springframework.stereotype.Service;
54
import org.springframework.transaction.annotation.Transactional;
65

76
import com.gaebaljip.exceed.common.Encryption;
7+
import com.gaebaljip.exceed.common.annotation.Timer;
88
import com.gaebaljip.exceed.dto.request.CheckMemberRequest;
99
import com.gaebaljip.exceed.member.adapter.out.persistence.MemberEntity;
1010
import com.gaebaljip.exceed.member.application.port.in.CheckCodeUsecase;

BE/exceed/src/main/java/com/gaebaljip/exceed/security/domain/JwtManager.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,14 @@ public boolean validateAccessToken(String accessToken, HttpServletRequest reques
7777
LocalDateTime.now(),
7878
e.getMessage());
7979
throw UnSupportedJwtException.EXECPTION; // 지원되지 않는 토큰
80+
} catch (io.jsonwebtoken.security.SignatureException e) {
81+
log.error(
82+
"method ={}, URL = {}, time={}, errorMessage={}",
83+
request.getMethod(),
84+
request.getRequestURL(),
85+
LocalDateTime.now(),
86+
e.getMessage());
87+
throw UnSupportedJwtException.EXECPTION; // 지원되지 않는 토큰
8088
} catch (IllegalArgumentException e) {
8189
log.error(
8290
"method ={}, URL = {}, time={}, errorMessage={}",

BE/exceed/src/main/java/com/gaebaljip/exceed/security/exception/JwtAuthenticationPoint.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,21 @@
66
import javax.servlet.http.HttpServletResponse;
77

88
import org.springframework.beans.factory.annotation.Qualifier;
9+
import org.springframework.http.HttpStatus;
10+
import org.springframework.http.MediaType;
911
import org.springframework.security.core.AuthenticationException;
1012
import org.springframework.security.web.AuthenticationEntryPoint;
1113
import org.springframework.stereotype.Component;
1214
import org.springframework.web.servlet.HandlerExceptionResolver;
1315

16+
import com.fasterxml.jackson.databind.ObjectMapper;
17+
import com.gaebaljip.exceed.common.ApiResponse;
18+
import com.gaebaljip.exceed.common.Error;
19+
20+
import lombok.extern.slf4j.Slf4j;
21+
1422
@Component
23+
@Slf4j
1524
public class JwtAuthenticationPoint implements AuthenticationEntryPoint {
1625

1726
private final HandlerExceptionResolver resolver;
@@ -27,7 +36,28 @@ public void commence(
2736
HttpServletResponse response,
2837
AuthenticationException authException)
2938
throws IOException {
30-
resolver.resolveException(
31-
request, response, null, (Exception) request.getAttribute("exception"));
39+
if (request.getAttribute("exception") == null) {
40+
handleAuthenticationException(response);
41+
} else {
42+
resolver.resolveException(
43+
request, response, null, (Exception) request.getAttribute("exception"));
44+
}
45+
}
46+
47+
private void handleAuthenticationException(HttpServletResponse response) throws IOException {
48+
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
49+
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
50+
response.setCharacterEncoding("UTF-8");
51+
response.isCommitted();
52+
ObjectMapper objectMapper = new ObjectMapper();
53+
objectMapper.writeValue(
54+
response.getWriter(),
55+
new ApiResponse.CustomBody<>(
56+
false,
57+
null,
58+
new Error(
59+
SecurityErrorCode.NEED_AUTHENTICATION.getCode(),
60+
SecurityErrorCode.NEED_AUTHENTICATION.getReason(),
61+
HttpStatus.BAD_REQUEST.toString())));
3262
}
3363
}

BE/exceed/src/main/java/com/gaebaljip/exceed/security/exception/SecurityErrorCode.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
public enum SecurityErrorCode {
99
INVALID_JWT(401, "5000", "잘못된 토큰입니다."),
1010
EXPIRED_JWT(401, "5001", "만료된 토큰입니다."),
11-
UNSUPPORTED_JWT(401, "5002", "지원되지 않는 토큰입니다.");
11+
UNSUPPORTED_JWT(401, "5002", "지원되지 않는 토큰입니다."),
12+
SIGNATURE_JWT(401, "5003", "토큰의 형식이 잘못 됬습니다."),
13+
NEED_AUTHENTICATION(401, "5004", "인증이 필요합니다.");
1214

1315
private final Integer status;
1416
private final String code;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.gaebaljip.exceed.security.exception;
2+
3+
import org.springframework.security.core.AuthenticationException;
4+
5+
import lombok.Getter;
6+
7+
@Getter
8+
public class SignatureJwtException extends AuthenticationException {
9+
10+
public static AuthenticationException EXECPTION = new SignatureJwtException();
11+
12+
public SignatureJwtException() {
13+
super(SecurityErrorCode.SIGNATURE_JWT.getReason());
14+
}
15+
}

BE/exceed/src/main/java/com/gaebaljip/exceed/security/filter/JwtAuthenticationFilter.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.IOException;
44
import java.time.LocalDateTime;
5+
import java.util.List;
56

67
import javax.servlet.FilterChain;
78
import javax.servlet.ServletException;
@@ -29,19 +30,19 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
2930
private final JwtManager jwtManager;
3031
private final JwtResolver jwtResolver;
3132
private final MemberDetailService memberDetailService;
33+
private final List<String> excludeUrl = List.of("/actuator", "/v1/health");
3234

3335
@Override
3436
protected void doFilterInternal(
3537
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
3638
throws ServletException, IOException {
3739

3840
final String bearerToken = request.getHeader(HttpHeaders.AUTHORIZATION);
39-
41+
log.info("bearerToken : {}", bearerToken);
4042
if (bearerToken == null || !bearerToken.startsWith("Bearer ")) {
4143
filterChain.doFilter(request, response);
4244
return;
4345
}
44-
4546
String accessToken = jwtResolver.extractToken(bearerToken);
4647
try {
4748
if (jwtManager.validateAccessToken(accessToken, request)) {
@@ -72,4 +73,16 @@ protected void doFilterInternal(
7273
}
7374
filterChain.doFilter(request, response);
7475
}
76+
77+
@Override
78+
protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {
79+
String path = request.getRequestURI();
80+
boolean flag = false;
81+
for (String url : excludeUrl) {
82+
if (path.startsWith(url)) {
83+
flag = true;
84+
}
85+
}
86+
return flag;
87+
}
7588
}

0 commit comments

Comments
 (0)