前提・実現したいこと
Spring boot2で画面のヘッダに表示させるログインユーザ名をInterceptorのpostHandleメソッドで取得したい。
発生している問題
まずSpringSecurityの設定を行いログイン機能の動作確認を行いました。
この時点ではログイン画面、ログイン後に遷移される画面でcssやjavascriptの読み込みは正常に行われていました。
次いでInterceptorの設定を試みたところ、ログイン画面でcssやjavascriptの読み込みが行われなくなり、
ログイン後の画面が真っ白な背景に
「{"timestamp":1570090424962,"status":999,"error":"None","message":"No message available"}」
とだけ表示されるようになりました。
(URLが「localhost:8080/コンテキスト/error」となっているため、ログイン自体正常に動作していなさそう?)
該当のソースコード
SpringSecurityの設定
Java
1@EnableWebSecurity 2public class SecurityConfig extends WebSecurityConfigurerAdapter { 3 @Override 4 public void configure(WebSecurity web) { 5 web.ignoring().mvcMatchers("/css/**", "/js/**"); 6 } 7 8 @Override 9 protected void configure(HttpSecurity http) throws Exception { 10 http.formLogin() 11 .loginPage("/login") 12 .permitAll(); 13 14 http.authorizeRequests() 15 .anyRequest() 16 .authenticated(); 17 18 http.logout() 19 .invalidateHttpSession(true) 20 .permitAll(); 21 } 22 23 @Bean 24 public PasswordEncoder passwordEncoder() { 25 return new BCryptPasswordEncoder(); 26 } 27}
Interceptorの設定
Java
1@Configuration 2public class InterceptorConfig extends WebMvcConfigurationSupport { 3 public UserInterseptor userInterceptor() { 4 return new UserInterseptor(); 5 } 6 7 @Override 8 protected void addInterceptors(InterceptorRegistry registry) { 9 registry.addInterceptor(userInterceptor()); 10 } 11}
Interceptorの処理
Java
1public class UserInterseptor implements HandlerInterceptor { 2 @Override 3 public void postHandle(HttpServletRequest request, HttpServletResponse response, 4 Object handler, ModelAndView modelAndView) throws Exception { 5 if (modelAndView != null && !isRedirectView(modelAndView)) { 6 if (isUserLogged()) { 7 addToModelUserDetails(modelAndView); 8 } 9 } 10 } 11 12 public static boolean isRedirectView(ModelAndView mv) { 13 String viewName = mv.getViewName(); 14 if (viewName.startsWith("redirect:/")) { 15 return true; 16 } 17 View view = mv.getView(); 18 return (view != null && view instanceof SmartView && ((SmartView) view).isRedirectView()); 19 } 20 21 public static boolean isUserLogged() { 22 try { 23 return !SecurityContextHolder.getContext().getAuthentication().getName().equals("anonymousUser"); 24 } catch (Exception e) { 25 return false; 26 } 27 } 28 29 private void addToModelUserDetails(ModelAndView model) { 30 String loggedUsername = SecurityContextHolder.getContext().getAuthentication().getName(); 31 model.addObject("loggedUsername", loggedUsername); 32 } 33}
試したこと
・SecurityConfigクラスのhttp.authorizeRequests()メソッドに.antMatchers("/resources/**").permitAll()を追加
・InterceptorConfigクラスのaddInterceptors(InterceptorRegistry registry)の内容をregistry.addInterceptor(userInterceptor()).addPathPatterns("/static/*");に変更
・InterceptorConfigクラスに以下を追加
@Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); }
補足情報(FW/ツールのバージョンなど)
Pleiades2019-06
Spring Boot 2.2.0 Build-SNAPSHOT
Java 1.8
回答1件
あなたの回答
tips
プレビュー