将Spring Security迁移到Java Config,authentication-success-handler-ref在哪里?

时间:2014-01-13 17:24:47

标签: java spring spring-mvc spring-security

我们的应用程序有一个成功登录的自定义成功处理程序。它基本上将它们重定向到他们的会话到期时他们所在的页面。

我们正在转向Java配置而不是spring xml配置。配置的其余部分非常顺利,但我们找不到将security:form-login标记的authentication-success-handler-ref属性放在何处。

<security:http auto-config='true'>
  ...
  <security:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY"/>
  <security:form-login login-page="/login" default-target-url="/sites"
                     authentication-failure-url="/login"
                     authentication-success-handler-ref="authenticationSuccessHandler"/>
 ...

到目前为止,这是我们的配置。

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
       .authorizeRequests()
          .anyRequest().authenticated()
          .and()
        .formLogin()
          .loginPage("/login")
          .failureUrl("/login")
          .and()
        .logout()
          .permitAll()
          .and()
  }

另外,我们找不到将default-target-url放在哪里,但这肯定不那么重要。

警告,我们实际上使用的是Groovy,但代码与Java配置基本相同。

2 个答案:

答案 0 :(得分:24)

所有设置都可以在全局配置方法中完成。添加以下内容:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
          .anyRequest().authenticated()
          .and()
        .formLogin()
          .loginPage("/login")
          .defaultSuccessUrl("/sites")
          .failureUrl("/login")
          .successHandler(yourSuccessHandlerBean) // autowired or defined below
          .and()
        .logout()
          .permitAll()
          .and()
  }

答案 1 :(得分:3)

您必须创建扩展SimpleUrlAuthenticationSuccessHandlerSavedRequestAwareAuthenticationSuccessHandler的bean。例如:

@Bean
public SavedRequestAwareAuthenticationSuccessHandler successHandler() {
    SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
    successHandler.setTargetUrlParameter("/secure/");
    return successHandler;
}

然后你必须在扩展AbstractAuthenticationProcessingFilter

的bean上设置它
UsernamePasswordAuthenticationFilter authenticationFilter = new UsernamePasswordAuthenticationFilter();
authenticationFilter.setAuthenticationSuccessHandler(successHandler());