私は最近、Webアプリケーションのログイン、ログアウト、およびロールベースのアクセスを処理するためにSpring Securityに切り替えました。私は情報とエラーメッセージのためにフラッシュメッセージを使用し、成功したログインとログアウト後にそのようなメッセージを表示したい。 JSPファイルで Springセキュリティコンフィグレーションのmessages.propertiesにアクセス
は、それらのメッセージは、次のコードを使用して示されています<c:if test = "${not empty flashmessage_error}" >
<div class="alert alert-danger"><c:out value="${flashmessage_error}" />
</div>
</c:if>
<c:if test="${not empty flashmessage_info}" >
<div class="alert alert-info"><c:out value="${flashmessage_info}" />
</div>
</c:if>
が成功し、ログイン後のフラッシュメッセージを表示するには、私はFlashMapにメッセージを入れて設定しカスタムLoginSuccessHandlerを定義しホームページにリダイレクトページ:次のように
public class FlashMessageAuthSuccessHandler extends
SavedRequestAwareAuthenticationSuccessHandler {
private String flashMessage = "Logged in!";
public void setFlashMessage(String flashMessage) {
this.flashMessage = flashMessage;
}
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws ServletException, IOException {
FlashMapManager flashMapManager = new SessionFlashMapManager();
FlashMap fm = new FlashMap();
fm.put(KeyConstants.FLASH_INFO_KEY, flashMessage);
flashMapManager.saveOutputFlashMap(fm, request, response);
setDefaultTargetUrl("/");
super.onAuthenticationSuccess(request, response, authentication);
}
}
マイSecurityConfigクラスにはなります
@Configuration
@EnableWebSecurity(debug = false)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private MessageSource messageSource;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(daoAuthenticationProvider());
}
/*
* HttpSecurity allows configuring web based security for specific HTTP requests
* By default it will be applies to all request, but can be restricted
* using requestMatcher
* @see org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#configure(org.springframework.security.config.annotation.web.builders.HttpSecurity)
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
//super.configure(http);
http
.authorizeRequests()
.antMatchers("/", "/css/**", "/js/**", "/images/**", "/about", "/error").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.usernameParameter("j_username")
.passwordParameter("j_password")
.loginPage("/login")
.loginProcessingUrl("/ssprocesslogin") //post request
// .defaultSuccessUrl("/") //cannot possibly used in combination with successHandler?
.successHandler(loginSuccesHandler())
.failureUrl("/login?" + KeyConstants.FLASH_ERROR_KEY + "=Verkeerde login message aanpassen") //default is /login?error
.permitAll()
.and()
.rememberMe()
.tokenValiditySeconds(2592000) //one month
.rememberMeParameter("j_rememberme")
.key("wIllekEUrigeSleutteL")
.userDetailsService(userDetailsService)
.and()
.logout()
.logoutUrl("/logout") //default is /logout
// .logoutSuccessUrl("/") //default is /login?logout
.logoutSuccessHandler(new FlashMessageLogoutSuccessHandler())
.invalidateHttpSession(true) //true is the default
;
}
@Bean
public FlashMessageAuthSuccessHandler loginSuccesHandler() {
FlashMessageAuthSuccessHandler handler = new FlashMessageAuthSuccessHandler();
//THIS DOES NOT WORK!!!!!
String loginSuccessMessage = messageSource.getMessage("flashmessage.loginsuccesful", null, "not found", null);
handler.setFlashMessage(loginSuccessMessage);
return handler;
}
@Bean
public AuthenticationProvider daoAuthenticationProvider() {
DaoAuthenticationProvider dap = new DaoAuthenticationProvider();
dap.setUserDetailsService(userDetailsService);
dap.setPasswordEncoder(passwordEncoder());
return dap;
}
@Bean
public ShaPasswordEncoder passwordEncoder() {
return new ShaPasswordEncoder(256);
}
}
しかし、messages.propertiesファイルからの適切なメッセージは表示されません。代わりに、文字列 "not found"がログイン後にフラッシュメッセージとして表示されます。 以下の行では、挿入されたMessageSourceを使用してメッセージキーでメッセージを検索しようとしていますが、示す:
String loginSuccessMessage = messageSource.getMessage("flashmessage.loginsuccesful", null, "not found", null);
messageSource Beanは、以下に示すようMvcConfigファイルで定義され、JSPファイル内のメッセージを表示するために使用された場合正常に動作しますが、tyhe希望を得るために、それは春のセキュリティ設定ファイルにautowiredすることができないようですフラッシュメッセージ。
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
どのように私はこれを達成することができますか?