From a8e4290d8b2086467c6b27334c14cbef26899825 Mon Sep 17 00:00:00 2001 From: bflykky Date: Sun, 4 Aug 2024 15:03:22 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=9D=B8=EC=A6=9D=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EC=9D=80=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EB=A5=BC=20=EC=B2=98=EB=A6=AC=ED=95=98=EB=8A=94=20Authenticati?= =?UTF-8?q?onEntryPoint=20=EA=B5=AC=ED=98=84=EC=B2=B4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/error/code/GlobalErrorCode.java | 1 + .../global/security/SecurityConfig.java | 7 +++- .../CustomAuthenticationEntryPoint.java | 37 +++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/umc/naoman/global/security/handler/CustomAuthenticationEntryPoint.java diff --git a/src/main/java/com/umc/naoman/global/error/code/GlobalErrorCode.java b/src/main/java/com/umc/naoman/global/error/code/GlobalErrorCode.java index 35aff4e..5f15172 100644 --- a/src/main/java/com/umc/naoman/global/error/code/GlobalErrorCode.java +++ b/src/main/java/com/umc/naoman/global/error/code/GlobalErrorCode.java @@ -22,6 +22,7 @@ public enum GlobalErrorCode implements ErrorCode { INTERNAL_SERVER_ERROR(500, "EG051", "내부 서버 오류입니다."), UNDEFINED_ERROR(400, "EG100", "정의되지 않은 에러입니다."), CLIENT_REGISTRATION_NOT_FOUND(400, "EM000", "해당 registrationId를 가진 ClientRegistration이 존재하지 않습니다."), + UNAUTHORIZED(401, "EG000", "인증되지 않은 사용자의 요청입니다. 로그인해 주세요."); ; private final int status; diff --git a/src/main/java/com/umc/naoman/global/security/SecurityConfig.java b/src/main/java/com/umc/naoman/global/security/SecurityConfig.java index cb53b09..734298f 100644 --- a/src/main/java/com/umc/naoman/global/security/SecurityConfig.java +++ b/src/main/java/com/umc/naoman/global/security/SecurityConfig.java @@ -4,6 +4,7 @@ import com.umc.naoman.domain.member.service.redis.RefreshTokenService; import com.umc.naoman.global.security.filter.JwtAuthenticationFilter; import com.umc.naoman.global.security.handler.CustomAccessDeniedHandler; +import com.umc.naoman.global.security.handler.CustomAuthenticationEntryPoint; import com.umc.naoman.global.security.handler.OAuth2LoginSuccessHandler; import com.umc.naoman.global.security.repository.OAuth2AuthorizationRequestBasedOnCookieRepository; import com.umc.naoman.global.security.service.CustomOAuth2UserService; @@ -26,6 +27,7 @@ public class SecurityConfig { private final CustomOAuth2UserService customOAuth2UserService; private final RefreshTokenService refreshTokenService; private final CustomAccessDeniedHandler customAccessDeniedHandler; + private final CustomAuthenticationEntryPoint customAuthenticationEntryPoint; private final JwtUtils jwtUtils; @Bean @@ -59,14 +61,15 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { "/v3/api-docs/**").permitAll() .anyRequest().authenticated() ) - .exceptionHandling(exception -> exception.accessDeniedHandler(customAccessDeniedHandler)) + .exceptionHandling(exception -> exception + .accessDeniedHandler(customAccessDeniedHandler) + .authenticationEntryPoint(customAuthenticationEntryPoint)) .oauth2Login(oauth2 -> oauth2 .authorizationEndpoint(endpoint -> endpoint .authorizationRequestRepository(oAuth2AuthorizationRequestBasedOnCookieRepository())) .userInfoEndpoint(userInfoEndpointConfig -> userInfoEndpointConfig.userService(customOAuth2UserService)) .successHandler(oAuth2LoginSuccessHandler()) - .loginPage("/auth/login") ) .addFilterAfter(new JwtAuthenticationFilter(jwtUtils), OAuth2LoginAuthenticationFilter.class); diff --git a/src/main/java/com/umc/naoman/global/security/handler/CustomAuthenticationEntryPoint.java b/src/main/java/com/umc/naoman/global/security/handler/CustomAuthenticationEntryPoint.java new file mode 100644 index 0000000..0fa4b07 --- /dev/null +++ b/src/main/java/com/umc/naoman/global/security/handler/CustomAuthenticationEntryPoint.java @@ -0,0 +1,37 @@ +package com.umc.naoman.global.security.handler; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.umc.naoman.global.error.ErrorResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.http.MediaType; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.nio.charset.Charset; + +import static com.umc.naoman.global.error.code.GlobalErrorCode.UNAUTHORIZED; + +@Component +public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint { + private final ObjectMapper objectMapper = new ObjectMapper(); + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, + AuthenticationException authException) throws IOException, ServletException { + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + response.setStatus(UNAUTHORIZED.getStatus()); + response.setCharacterEncoding(Charset.defaultCharset().name()); + + ErrorResponse errorResponse = ErrorResponse.builder() + .status(response.getStatus()) + .code(UNAUTHORIZED.getMessage()) + .message(authException.getMessage()) + .data(null) + .build(); + + response.getWriter().write(objectMapper.writeValueAsString(errorResponse)); + } +} \ No newline at end of file