From 541320065cf0be3f3722fa6361de3d3804b262ad Mon Sep 17 00:00:00 2001 From: abel Date: Thu, 10 Dec 2020 23:14:20 +0900 Subject: [PATCH] =?UTF-8?q?AuthenticationEntryPoint,=20AccessDeniedHandler?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20=ED=9B=84=20=EB=B0=9C=EC=83=9D=ED=95=98?= =?UTF-8?q?=EB=8A=94=20exception=EC=9D=98=20=EB=8B=A4=EA=B5=AD=EC=96=B4=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=EA=B0=80=20=EB=90=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20=EC=A0=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/CustomAccessDeniedHandler.java | 9 +++-- .../CustomAuthenticationEntryPoint.java | 9 +++-- .../security/SecurityConfiguration.java | 35 +++++++++++++++++++ .../exception/ExceptionController.java | 2 +- 4 files changed, 50 insertions(+), 5 deletions(-) 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(""); }