我在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设置的具体点:
但是,我不知道如何为我的情况设置自定义请求缓存配置器!是不是有更简单的方法呢?
更新2
我现在发现这个问题只发生在使用Firefox而不是Chrome或Internet Explorer时。
答案 0 :(得分:0)
我现在的firefox浏览器确实存在问题。即使我删除了所有导航和缓存数据,它仍然会发生,但不会像其他浏览器那样发生Chrome或IE,甚至连其他FF浏览器都没有。