하고싶었던 개인프로젝트를 진행하면서 정리하고싶고 마주한 어려움도 많았지만 우선 권한 인증 에러부분 같은 경우 이전에도 CustomException으로 동일하게 처리하고싶었기 때문에 이것 먼저 정리해둔다.
문제 상황

-> 이미 인텔리제이 종료후 유효하지않은 token 값으로 접근한 경우

-> 사용자 없을 때 CustomException 처리 문구
문제 > 로그인이 안된 상태인데 401에러가 아닌 403에러를 뱉어내고, 내내 CustomException으로 동일성을 주었던것이
권한 인증에 관련해서 일관성이 없어서 마음에 안들었다.
해결 방법

JwtAccessDeniedHandler
@Component
public class JwtAccessDeniedHandler implements AccessDeniedHandler {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
ErrorResponse errorResponse;
// 필요한 권한이 없이 접근하려 할때 403
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
errorResponse = ErrorResponse.builder()
.httpCode(403)
.errorCode(NOT_MATCH_AUTHORIZATION)
.ErrorMessage(NOT_MATCH_AUTHORIZATION.getDescription())
.build();
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(objectMapper.writeValueAsString(errorResponse));
response.flushBuffer();
}
}
JwtAuthenticationEntryPoint
@Component
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
ErrorResponse errorResponse;
// 유효한 자격증명을 제공하지 않고 접근하려 할때 401
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
errorResponse = ErrorResponse.builder()
.httpCode(401)
.errorCode(UN_AUTHORIZATION)
.ErrorMessage(UN_AUTHORIZATION.getDescription())
.build();
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(objectMapper.writeValueAsString(errorResponse));
response.flushBuffer();
}
}
각 인증이 없었을 경우, 권한이 없었을 경우를 처리할 수 있도록 Component 클래스를 만든다.
그리고 나서 SecurityConfig에 다음과 같이 exceptionHandeling에 처리하도록 설정하면된다.
SecurityConfig
@Override
protected void configure(HttpSecurity http) throws Exception {
http
...
.and()
.exceptionHandling()
.authenticationEntryPoint(jwtAuthenticationEntryPoint)
.accessDeniedHandler(jwtAccessDeniedHandler)
....
}
결과
401 에러 CustomException
1. 401 에러> 로그인 후 로그아웃 or 인텔리제이 종료 후 기존 token값으로 접근하려는 경우

-> 로그아웃된 User 토큰값으로 User 접근 페이지 접근한 경우

-> 로그아웃된 User 토큰값으로 Admin 접근 페이지 접근한 경우

-> accessToken 유효기간이 지난 후 접근하려는 경우
403 에러 CustomException
2. 403 에러 > 로그인 후 발급받은 token이 User(일반사용자)인데 Admin(카페관계자) 페이지에 접근하려는 경우

'Spring' 카테고리의 다른 글
org.hibernate.PersistentObjectException: detached entity passed to persist 에러 (0) | 2023.11.20 |
---|---|
window 환경에서 sdkman 설치하기 (0) | 2023.09.05 |
spring boot version 3.x.x 사용시 swagger 사용이 불가한 상황 생김 (0) | 2023.08.23 |
하고싶었던 개인프로젝트를 진행하면서 정리하고싶고 마주한 어려움도 많았지만 우선 권한 인증 에러부분 같은 경우 이전에도 CustomException으로 동일하게 처리하고싶었기 때문에 이것 먼저 정리해둔다.
문제 상황

-> 이미 인텔리제이 종료후 유효하지않은 token 값으로 접근한 경우

-> 사용자 없을 때 CustomException 처리 문구
문제 > 로그인이 안된 상태인데 401에러가 아닌 403에러를 뱉어내고, 내내 CustomException으로 동일성을 주었던것이
권한 인증에 관련해서 일관성이 없어서 마음에 안들었다.
해결 방법

JwtAccessDeniedHandler
@Component
public class JwtAccessDeniedHandler implements AccessDeniedHandler {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
ErrorResponse errorResponse;
// 필요한 권한이 없이 접근하려 할때 403
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
errorResponse = ErrorResponse.builder()
.httpCode(403)
.errorCode(NOT_MATCH_AUTHORIZATION)
.ErrorMessage(NOT_MATCH_AUTHORIZATION.getDescription())
.build();
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(objectMapper.writeValueAsString(errorResponse));
response.flushBuffer();
}
}
JwtAuthenticationEntryPoint
@Component
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
ErrorResponse errorResponse;
// 유효한 자격증명을 제공하지 않고 접근하려 할때 401
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
errorResponse = ErrorResponse.builder()
.httpCode(401)
.errorCode(UN_AUTHORIZATION)
.ErrorMessage(UN_AUTHORIZATION.getDescription())
.build();
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(objectMapper.writeValueAsString(errorResponse));
response.flushBuffer();
}
}
각 인증이 없었을 경우, 권한이 없었을 경우를 처리할 수 있도록 Component 클래스를 만든다.
그리고 나서 SecurityConfig에 다음과 같이 exceptionHandeling에 처리하도록 설정하면된다.
SecurityConfig
@Override
protected void configure(HttpSecurity http) throws Exception {
http
...
.and()
.exceptionHandling()
.authenticationEntryPoint(jwtAuthenticationEntryPoint)
.accessDeniedHandler(jwtAccessDeniedHandler)
....
}
결과
401 에러 CustomException
1. 401 에러> 로그인 후 로그아웃 or 인텔리제이 종료 후 기존 token값으로 접근하려는 경우

-> 로그아웃된 User 토큰값으로 User 접근 페이지 접근한 경우

-> 로그아웃된 User 토큰값으로 Admin 접근 페이지 접근한 경우

-> accessToken 유효기간이 지난 후 접근하려는 경우
403 에러 CustomException
2. 403 에러 > 로그인 후 발급받은 token이 User(일반사용자)인데 Admin(카페관계자) 페이지에 접근하려는 경우

'Spring' 카테고리의 다른 글
org.hibernate.PersistentObjectException: detached entity passed to persist 에러 (0) | 2023.11.20 |
---|---|
window 환경에서 sdkman 설치하기 (0) | 2023.09.05 |
spring boot version 3.x.x 사용시 swagger 사용이 불가한 상황 생김 (0) | 2023.08.23 |