Skip to content

Commit

Permalink
Merge pull request #191 from GEON-PPANG/fix/#189
Browse files Browse the repository at this point in the history
[FIX] 일부 auth 관련 api 응답값 json으로 변경
  • Loading branch information
seunghaLim authored Sep 4, 2023
2 parents feaaac4 + 0e0e143 commit c56fb7f
Show file tree
Hide file tree
Showing 10 changed files with 70 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public class RequestApiInfo {
private final String dateTime =
LocalDateTime.now(ZoneId.of("Asia/Seoul"))
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
;
private final ObjectMapper objectMapper = new ObjectMapper();

public RequestApiInfo(JoinPoint joinPoint, Class clazz, ObjectMapper objectMapper) {

Expand Down
29 changes: 29 additions & 0 deletions api/src/main/java/com/org/gunbbang/common/DTO/ApiResponse.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.org.gunbbang.common.DTO;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.org.gunbbang.errorType.ErrorType;
import com.org.gunbbang.errorType.SuccessType;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
Expand Down Expand Up @@ -35,4 +38,30 @@ public static ApiResponse error(ErrorType error, String message) {
public static ApiResponse error(int errorCode, String message) {
return new ApiResponse<>(errorCode, message);
}

public static void sendSuccessResponseBody(
HttpServletResponse response, ObjectMapper objectMapper, SuccessType successType)
throws IOException {
response.setStatus(successType.getHttpStatusCode());
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8");

ApiResponse responseBody = ApiResponse.success(successType);
String jsonResponse = objectMapper.writeValueAsString(responseBody);

response.getWriter().write(jsonResponse);
}

public static void sendErrorResponseBody(
HttpServletResponse response, ObjectMapper objectMapper, ErrorType errorType)
throws IOException {
response.setStatus(errorType.getHttpStatusCode());
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8");

ApiResponse responseBody = ApiResponse.error(errorType);
String jsonResponse = objectMapper.writeValueAsString(responseBody);

response.getWriter().write(jsonResponse);
}
}
8 changes: 4 additions & 4 deletions api/src/main/java/com/org/gunbbang/config/SecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -113,17 +113,17 @@ public PasswordEncoder passwordEncoder() {

@Bean
public LoginSuccessHandler loginSuccessHandler() {
return new LoginSuccessHandler(jwtService);
return new LoginSuccessHandler(jwtService, objectMapper);
}

@Bean
public LoginFailureHandler loginFailureHandler() {
return new LoginFailureHandler();
return new LoginFailureHandler(objectMapper);
}

@Bean
public Filter jwtAuthenticationProcessingFilter() {
return new JwtAuthenticationProcessingFilter(jwtService, memberRepository);
return new JwtAuthenticationProcessingFilter(jwtService, memberRepository, objectMapper);
}

@Bean
Expand All @@ -138,6 +138,6 @@ public CustomLogoutHandler customlogoutHandler() {

@Bean
public LogoutSuccessHandler customLogoutSuccessHandler() {
return new LogoutSuccessHandler();
return new LogoutSuccessHandler(objectMapper);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.org.gunbbang.jwt.filter;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.org.gunbbang.BadRequestException;
import com.org.gunbbang.CustomJwtTokenException;
import com.org.gunbbang.NotFoundException;
import com.org.gunbbang.common.DTO.ApiResponse;
import com.org.gunbbang.entity.Member;
import com.org.gunbbang.errorType.ErrorType;
import com.org.gunbbang.errorType.SuccessType;
import com.org.gunbbang.jwt.service.JwtService;
import com.org.gunbbang.login.CustomUserDetails;
import com.org.gunbbang.repository.MemberRepository;
Expand All @@ -32,6 +34,9 @@ public class JwtAuthenticationProcessingFilter extends OncePerRequestFilter {
private static final String H2_PREFIX = "/h2-console";
private final JwtService jwtService;
private final MemberRepository memberRepository;
private final ObjectMapper objectMapper;
private final GrantedAuthoritiesMapper authoritiesMapper = new NullAuthoritiesMapper();

private static final List<String> WHITE_LIST =
List.of(
"/auth/signup",
Expand All @@ -43,8 +48,6 @@ public class JwtAuthenticationProcessingFilter extends OncePerRequestFilter {
"/actuator/health",
"/favicon.ico");

private final GrantedAuthoritiesMapper authoritiesMapper = new NullAuthoritiesMapper();

@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
String path = request.getRequestURI();
Expand Down Expand Up @@ -73,7 +76,7 @@ protected void doFilterInternal(
}

private void refreshAccessAndRefreshTokens(
HttpServletRequest request, HttpServletResponse response) throws JsonProcessingException {
HttpServletRequest request, HttpServletResponse response) throws IOException {
log.info("토큰 리프레시 접근 요청 처리 시작.");

String accessToken = jwtService.extractAccessTokenAsString(request);
Expand Down Expand Up @@ -103,6 +106,8 @@ private void refreshAccessAndRefreshTokens(
}

jwtService.reIssueTokensAndUpdateRefreshToken(response, foundMember);
ApiResponse.sendSuccessResponseBody(
response, objectMapper, SuccessType.ISSUE_REFRESH_TOKEN_SUCCESS);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public class JwtService {
private static final String BEARER_PREFIX = "Bearer ";

private final MemberRepository memberRepository;
private static final ObjectMapper objectMapper = new ObjectMapper(); // TODO: static 넣을지 뺄지??
private final ObjectMapper objectMapper;

public String createAccessToken(String email, Long memberId) {
Date now = new Date();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,27 @@
package com.org.gunbbang.login.handler;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.org.gunbbang.common.DTO.ApiResponse;
import com.org.gunbbang.errorType.ErrorType;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;

/** 로그인 실패 시 호출되는 핸들러 */
@Slf4j
@RequiredArgsConstructor
public class LoginFailureHandler extends SimpleUrlAuthenticationFailureHandler {
private final ObjectMapper objectMapper;

@Override
public void onAuthenticationFailure(
HttpServletRequest request, HttpServletResponse response, AuthenticationException exception)
throws IOException {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/plain;charset=UTF-8/");
response.getWriter().write("로그인 실패. 아이디나 비밀번호 확인해주세요");
log.info("로그인에 실패했습니다. 메시지 : {}", exception.getMessage());
log.warn("로그인 실패. error message: {}", exception.getMessage());
ApiResponse.sendErrorResponseBody(response, objectMapper, ErrorType.LOGIN_FAIL_EXCEPTION);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package com.org.gunbbang.login.handler;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.org.gunbbang.common.DTO.ApiResponse;
import com.org.gunbbang.errorType.SuccessType;
import com.org.gunbbang.jwt.service.JwtService;
import com.org.gunbbang.login.CustomUserDetails;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
Expand All @@ -15,10 +19,12 @@
@RequiredArgsConstructor
public class LoginSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
private final JwtService jwtService;
private final ObjectMapper objectMapper;

@Override
public void onAuthenticationSuccess(
HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
HttpServletRequest request, HttpServletResponse response, Authentication authentication)
throws IOException {
String email = extractUsername(authentication);
Long memberId = extractMemberId(authentication);
String accessToken = jwtService.createAccessToken(email, memberId);
Expand All @@ -27,6 +33,8 @@ public void onAuthenticationSuccess(
// accessToken 및 refreshToken 헤더에 전송
jwtService.sendAccessAndRefreshToken(response, accessToken, refreshToken);
jwtService.updateRefreshToken(email, refreshToken);

ApiResponse.sendSuccessResponseBody(response, objectMapper, SuccessType.LOGIN_SUCCESS);
log.info("로그인 요청 성공. 이메일 : {} memberId : {} ", email, memberId);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.org.gunbbang.login.handler;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.org.gunbbang.common.DTO.ApiResponse;
import com.org.gunbbang.errorType.SuccessType;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
Expand All @@ -12,15 +14,12 @@
@Slf4j
@RequiredArgsConstructor
public class LogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {
private final ObjectMapper objectMapper;

public void onLogoutSuccess(
HttpServletRequest request, HttpServletResponse response, Authentication authentication)
throws IOException, ServletException {
throws IOException {
log.info("LogoutSuccessHandler 진입");

response.setStatus(HttpServletResponse.SC_OK);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/plain;charset=UTF-8/");
response.getWriter().write("로그아웃 성공.");
ApiResponse.sendSuccessResponseBody(response, objectMapper, SuccessType.LOGOUT_SUCCESS);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public enum ErrorType {
NO_REQUEST_HEADER_EXCEPTION(HttpStatus.BAD_REQUEST, "필요한 헤더 값이 오지 않았습니다"),
PARAMETER_TYPE_MISMATCH_EXCEPTION(HttpStatus.BAD_REQUEST, "요청 값의 타입이 올바르지 않습니다"),
REQUEST_BIND_EXCEPTION(HttpStatus.BAD_REQUEST, "요청 값 바인딩에 실패했습니다"),
LOGIN_FAIL_EXCEPTION(HttpStatus.BAD_REQUEST, "로그인에 실패하였습니다. 아이디나 비밀번호 확인해주세요"),

/** 401 */
ABUSED_REFRESH_TOKEN_EXCEPTION(HttpStatus.UNAUTHORIZED, "토큰 재발급 실패"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
public enum SuccessType {
/** 200 OK */
LOGIN_SUCCESS(HttpStatus.OK, "로그인에 성공했습니다."),
LOGOUT_SUCCESS(HttpStatus.OK, "로그아웃에 성공했습니다."),
GET_POST_LIST_SUCCESS(HttpStatus.OK, "게시물 리스트 조회에 성공했습니다."),
GET_POST_SUCCESS(HttpStatus.OK, "게시물 조회에 성공했습니다."),
GET_EMOTION_CALENDAR_SUCCESS(HttpStatus.OK, "감정 캘린더 조회에 성공했습니다."),
Expand All @@ -31,6 +32,7 @@ public enum SuccessType {
GET_MEMBER_NICKNAME_SUCCESS(HttpStatus.OK, "현재 접속회원의 닉네임 조회 성공"),
DELETE_MEMBER_SUCCESS(HttpStatus.OK, "회원 탈퇴에 성공했습니다"),
UPDATE_MEMBER_NICKNAME_SUCCESS(HttpStatus.OK, "현재 접속회원의 닉네임 변경 성공"),
ISSUE_REFRESH_TOKEN_SUCCESS(HttpStatus.OK, "토큰 재발급에 성공했습니다"),

/** 201 CREATED */
SIGNUP_SUCCESS(HttpStatus.CREATED, "회원가입이 완료됐습니다."),
Expand Down

0 comments on commit c56fb7f

Please sign in to comment.