1 Commits

4 changed files with 50 additions and 5 deletions

View File

@@ -1,10 +1,13 @@
package com.rest.api.config.security; package com.rest.api.config.security;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
@@ -14,7 +17,9 @@ import java.io.IOException;
public class CustomAccessDeniedHandler implements AccessDeniedHandler { public class CustomAccessDeniedHandler implements AccessDeniedHandler {
@Override @Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exception) throws IOException { public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exception) throws IOException, ServletException {
response.sendRedirect("/exception/accessdenied"); response.setLocale(LocaleContextHolder.getLocale());
RequestDispatcher rd = request.getRequestDispatcher("/exception/accessdenied");
rd.forward(request, response);
} }
} }

View File

@@ -1,10 +1,13 @@
package com.rest.api.config.security; package com.rest.api.config.security;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
@@ -13,7 +16,9 @@ import java.io.IOException;
@Component @Component
public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint { public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override @Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException ex) throws IOException { public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException ex) throws IOException, ServletException {
response.sendRedirect("/exception/entrypoint"); response.setLocale(LocaleContextHolder.getLocale());
RequestDispatcher rd = request.getRequestDispatcher("/exception/entrypoint");
rd.forward(request, response);
} }
} }

View File

@@ -3,6 +3,7 @@ package com.rest.api.config.security;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 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.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; 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 @RequiredArgsConstructor
@Configuration @Configuration
@@ -39,6 +46,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
.and() .and()
.exceptionHandling().authenticationEntryPoint(new CustomAuthenticationEntryPoint()) .exceptionHandling().authenticationEntryPoint(new CustomAuthenticationEntryPoint())
.and() .and()
.addFilterBefore(new AthenticationEntryLocaleFilter(), UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class); // jwt token 필터를 id/password 인증 필터 전에 넣어라. .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class); // jwt token 필터를 id/password 인증 필터 전에 넣어라.
} }
@@ -49,4 +57,31 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
"/swagger-ui.html", "/webjars/**", "/swagger/**"); "/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() {
}
}
} }

View File

@@ -18,7 +18,7 @@ public class ExceptionController {
throw new CAuthenticationEntryPointException(); throw new CAuthenticationEntryPointException();
} }
@GetMapping(value = "/accessdenied") @RequestMapping(value = "/accessdenied")
public CommonResult accessdeniedException() { public CommonResult accessdeniedException() {
throw new AccessDeniedException(""); throw new AccessDeniedException("");
} }