2016-03-21 15 views
0

私は最近、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; 
} 

どのように私はこれを達成することができますか?

答えて

0

これは実際には、MessageSourceがConfigurationオブジェクトに挿入する準備ができていないという問題だと思います。あなたのソリューションはおそらく動作し、@Valueアノテーションを使用してapplication.propertiesファイルからプロパティを読み込む必要があります。

@Configuration 
@PropertySource(value= {"classpath:application.properties"}) 
public class AppConfig { 
} 

をし、環境オブジェクトを注入し、他の構成ファイルの1つで希望の値にアクセスします:私はすでに私のAppConfigクラスでこのファイルを読まない

@Autowired 
private Environment env; 

とloginSuccesHandler()メソッドで

String loginSuccessMessage = env.getProperty("flashmessage.loginsuccesful"); 

これは機能し、問題の一部を解決します。プロパティを使用するには、私の主な理由は、おそらく異なるで、他のローカライズされたメッセージと一緒に、それを定義することであったapplication.propertiesにmessages.propertiesから移動する必要が

flashmessage.loginsuccesful=You have been logged in succesfully! 

:残りの問題は、そのプロパティの宣言であります将来の言語 ロケールがこの時点で分かっていない可能性があります。

UPDATE: Iは、ルートコンテキスト(AppConfig.java)にディスパッチャサーブレット・コンテキスト(MvcConfig.java)からMessageSourceビーンの宣言を移動させることにより問題を解決しました。 SecurityConfigクラスは明らかにサーブレット・コンテキストにアクセスできません。

0

コンフィギュレーションオブジェクト内でメッセージソースをautowiringしています。 MessageSource Beanは、まだ準備ができていない可能性が非常に高いです。

私はこのような何かしようとするだろう:

@Bean(name = "message") 
public PropertiesFactoryBean message() { 
    PropertiesFactoryBean bean = new PropertiesFactoryBean(); 
    bean.setLocation(new ClassPathResource("com/your/program/resources/message.properties")); 
    return bean; 
} 

の作成:Javaベースの構成を使用している場合

<util:properties id="message" location="classpath:com/your/program/resources/message.properties" /> 

か、次の次の追加、applicationContext.xmlをで

public class FlashMessageAuthSuccessHandler extends 
    SavedRequestAwareAuthenticationSuccessHandler { 

@Value(${flashmessage.loginsuccesful}) 
private String flashMessage; 

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); 
} 
} 
0

を以下のようにSecurity Configで@Valueアノテーションを使用してください:

@Value(value = "#{'${flashmessage.loginsuccesful}'}") 
private String loginSuccessMessage; 

または参照用

@Value("#{message['flashmessage.loginsuccesful']}") 
private String loginSuccessMessage; 

チェックlink

関連する問題