diff --git a/src/main/java/com/rest/api/config/security/CustomAccessDeniedHandler.java b/src/main/java/com/rest/api/config/security/CustomAccessDeniedHandler.java index e1cdff0..ca71885 100644 --- a/src/main/java/com/rest/api/config/security/CustomAccessDeniedHandler.java +++ b/src/main/java/com/rest/api/config/security/CustomAccessDeniedHandler.java @@ -1,10 +1,13 @@ package com.rest.api.config.security; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.stereotype.Component; +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -14,7 +17,9 @@ import java.io.IOException; public class CustomAccessDeniedHandler implements AccessDeniedHandler { @Override - public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exception) throws IOException { - response.sendRedirect("/exception/accessdenied"); + public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exception) throws IOException, ServletException { + response.setLocale(LocaleContextHolder.getLocale()); + RequestDispatcher rd = request.getRequestDispatcher("/exception/accessdenied"); + rd.forward(request, response); } } \ No newline at end of file diff --git a/src/main/java/com/rest/api/config/security/CustomAuthenticationEntryPoint.java b/src/main/java/com/rest/api/config/security/CustomAuthenticationEntryPoint.java index 1e898b5..7f16d0a 100644 --- a/src/main/java/com/rest/api/config/security/CustomAuthenticationEntryPoint.java +++ b/src/main/java/com/rest/api/config/security/CustomAuthenticationEntryPoint.java @@ -1,10 +1,13 @@ package com.rest.api.config.security; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.stereotype.Component; +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -13,7 +16,9 @@ import java.io.IOException; @Component public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override - public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException ex) throws IOException { - response.sendRedirect("/exception/entrypoint"); + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException ex) throws IOException, ServletException { + response.setLocale(LocaleContextHolder.getLocale()); + RequestDispatcher rd = request.getRequestDispatcher("/exception/entrypoint"); + rd.forward(request, response); } } \ No newline at end of file diff --git a/src/main/java/com/rest/api/config/security/SecurityConfiguration.java b/src/main/java/com/rest/api/config/security/SecurityConfiguration.java index c255e3a..7e9a0bc 100644 --- a/src/main/java/com/rest/api/config/security/SecurityConfiguration.java +++ b/src/main/java/com/rest/api/config/security/SecurityConfiguration.java @@ -3,6 +3,7 @@ package com.rest.api.config.security; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.http.HttpMethod; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.web.builders.HttpSecurity; @@ -10,6 +11,12 @@ import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.util.Locale; @RequiredArgsConstructor @Configuration @@ -39,6 +46,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { .and() .exceptionHandling().authenticationEntryPoint(new CustomAuthenticationEntryPoint()) .and() + .addFilterBefore(new AthenticationEntryLocaleFilter(), UsernamePasswordAuthenticationFilter.class) .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class); // jwt token 필터를 id/password 인증 필터 전에 넣어라. } @@ -49,4 +57,31 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { "/swagger-ui.html", "/webjars/**", "/swagger/**"); } + + private static class AthenticationEntryLocaleFilter implements Filter { + private SessionLocaleResolver localeResolver; + + private AthenticationEntryLocaleFilter() { + localeResolver = new SessionLocaleResolver(); + localeResolver.setDefaultLocale(Locale.KOREAN); + } + + @Override + public void init(FilterConfig filterConfig) { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + if(request.getParameter("lang") != null) + localeResolver.setDefaultLocale(Locale.forLanguageTag(request.getParameter("lang"))); + Locale locale = localeResolver.resolveLocale((HttpServletRequest) request); + LocaleContextHolder.setLocale(locale); + chain.doFilter(request, response); + } + + @Override + public void destroy() { + } + } } + diff --git a/src/main/java/com/rest/api/controller/exception/ExceptionController.java b/src/main/java/com/rest/api/controller/exception/ExceptionController.java index dbea7cf..cb1657e 100644 --- a/src/main/java/com/rest/api/controller/exception/ExceptionController.java +++ b/src/main/java/com/rest/api/controller/exception/ExceptionController.java @@ -18,7 +18,7 @@ public class ExceptionController { throw new CAuthenticationEntryPointException(); } - @GetMapping(value = "/accessdenied") + @RequestMapping(value = "/accessdenied") public CommonResult accessdeniedException() { throw new AccessDeniedException(""); }