【问题标题】:Moving Spring Security To Java Config, where does authentication-success-handler-ref go?将 Spring Security 移至 Java Config,authentication-success-handler-ref 去哪儿了?
【发布时间】:2014-02-01 13:36:41
【问题描述】:

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

我们正在转向 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 配置基本相同。

【问题讨论】:

    标签: java spring spring-mvc spring-security


    【解决方案1】:

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

    @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()
      }
    

    【讨论】:

    • 谢谢,正是我需要的!
    • 只是想补充一点,您可以指定一个替代构造函数,该构造函数采用布尔值指定您是否总是希望在成功登录后重定向到指定的 URL - 例如,defaultSuccessUrl("/sites", true )。请注意,如果未指定此布尔值,则 spring 会将您重定向到您尝试访问的 url,然后再重定向到身份验证页面。
    • remember-me 身份验证怎么样?如何处理?
    【解决方案2】:

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

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

    然后你必须在扩展AbstractAuthenticationProcessingFilter的bean上设置它:

    UsernamePasswordAuthenticationFilter authenticationFilter = new UsernamePasswordAuthenticationFilter();
    authenticationFilter.setAuthenticationSuccessHandler(successHandler());
    

    【讨论】:

    • 麻烦的是,AbstractAuthenticationProcessingFilter 需要实现 attemptAuthentication 方法,如果我们已经有一个自定义身份验证提供程序,我们可能不想这样做。
    • 仅供参考,successHandler.setTargetUrlParameter 用于在身份验证成功时让 SpringSecurity 响应查询参数。因此,您可能有类似:successHandler.setTargetUrlParameter("next");,然后,如果 url 是:http://localhost:8080/login?next=/foo,则在成功验证时,成功处理程序将重定向到 /foo。注意:自 2014 年以来情况可能发生了变化,但由于我在谷歌搜索中找到了这个,我想我会提供这个信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2014-07-18
    • 2010-10-13
    • 1970-01-01
    • 2011-03-03
    • 2014-03-15
    相关资源
    最近更新 更多