具有自定义提供程序和处理程序的Spring Security 4在身份验证之前不缓存URL

时间:2015-06-18 10:31:29

标签: java spring spring-security

我在Spring Security(v4.0.1)中配置了自定义身份验证提供程序,成功处理程序和失败处理程序。使用默认页面时,在显示登录页面后,用户被重定向到先前请求的URL。但是,我在实现自己的行为时失去了这种行为,所以我试图恢复它。

基本上,现在,每次登录时我都会被重定向到主页,即使我已经加入登录页面,试图获取另一个资源(在我的情况下 / web / users )。这就是我现在的配置:

@Configuration bean(扩展WebSecurityConfigurerAdapter

@Override
protected void configure(HttpSecurity http) throws Exception {

    http.logout()
            .logoutRequestMatcher(new AntPathRequestMatcher("/web/logout"))
            .invalidateHttpSession(true).logoutSuccessUrl("/web/login");

    http.authorizeRequests()
            .antMatchers("/javax.faces.resource/**")
            .permitAll()
            .antMatchers("/web/recovery").permitAll()
            .antMatchers("/web/users").authenticated().anyRequest()
            .authenticated().and().formLogin()
            .failureHandler(failureHandler).loginPage("/web/login")
            .loginProcessingUrl("/web/j_spring_security_check")
            .successHandler(successHandler).permitAll();
}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth,
        DataSource ds, PasswordEncoder pwdEncoder) throws Exception {
    auth.authenticationProvider(authProvider);
}

自定义AuthenticationSuccessHandler

public class SystemAuthenticationSuccessHandler extends
    SavedRequestAwareAuthenticationSuccessHandler {

private IUserService service;

public SystemAuthenticationSuccessHandler(IUserService service) {
    this.service = service;
    setDefaultTargetUrl("/web/home");
}

@Override
public void onAuthenticationSuccess(HttpServletRequest request,
        HttpServletResponse response, Authentication authentication)
        throws IOException, ServletException {
    String username = request.getParameter("username");
    User user = service.findByIdOrEmail(username, username);
    if (user != null) {
        service.saveLoginSuccess(user.getId());
    }
    //Call the parent method to manage the successful authentication
    super.onAuthenticationSuccess(request, response, authentication);
}

基本上,我遇到的问题requestCache总是在SavedRequestAwareAuthenticationSuccessHandler#onAuthenticationSuccess方法中为当前请求返回null,这是因为HttpSessionRequestCache#saveRequest方法与我的传入不匹配请求重定向到登录页面之前请求。

具体来说,HttpSessionRequestCache Spring使用的是AndRequestMatcher,它会丢弃我的所有传入请求。我希望它使用AnyRequestMatcher,但不知道如何告诉Spring。

更新

HttpSessionRequestCache#setRequestMatcher中设置断点,这是Spring Security设置的具体点:

enter image description here

但是,我不知道如何为我的情况设置自定义请求缓存配置器!是不是有更简单的方法呢?

更新2

我现在发现这个问题只发生在使用Firefox而不是Chrome或Internet Explorer时。

1 个答案:

答案 0 :(得分:0)

我现在的firefox浏览器确实存在问题。即使我删除了所有导航和缓存数据,它仍然会发生,但不会像其他浏览器那样发生Chrome或IE,甚至连其他FF浏览器都没有。