我有一个使用Spring Security 3.2.9的Spring MVC Java应用程序。该应用程序使用Java配置进行安全配置,本地登录/身份验证过程正常。
但是,当应用程序在我们的Heroku dev环境中运行时,登录失败并未到达正确的URL。我可以在日志中看到正在对正确的URL进行GET调用,“/ signin?error = 1”,但是对“/”的额外调用似乎正在劫持它并重定向到主URL“/”。
安全配置为:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/signin**", "/resources/**", "/signup").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.failureUrl("/signin?error=1")
.loginPage("/signin")
.permitAll()
.loginProcessingUrl("/authenticate")
.and()
.logout()
.logoutUrl("/logout")
.permitAll()
.logoutSuccessUrl("/signin")
.and()
.rememberMe()
.rememberMeServices(rememberMeServices())
.key("remember-me-key")
;
}
在Heroku日志中,我看到对“/ authenticate”的调用,对“/ signin?error = 1”的调用,以及对“/”的调用。这些出现在日志中的顺序不一致,因此它不一定是一系列事件。
Jun 11 06:25:54 myapp-dev heroku/router: at=info method=POST path="/authenticate" host=myapp-dev.herokuapp.com request_id=25cfa779-67ab-4bb4-a036-d25ad3e893cb fwd="109.159.48.152" dyno=web.1 connect=0ms service=11ms status=302 bytes=465 protocol=https
Jun 11 06:25:54 myapp-dev heroku/router: at=info method=GET path="/signin?error=1" host=myapp-dev.herokuapp.com request_id=7dcbbc85-2f7a-4acf-94c3-adc8231eb980 fwd="109.159.48.152" dyno=web.1 connect=0ms service=1ms status=302 bytes=171 protocol=http
Jun 11 06:25:54 myapp-dev heroku/router: at=info method=GET path="/" host=myapp-dev.herokuapp.com request_id=5be5f96c-0e29-4caf-9183-c3976ec19c9b fwd="109.159.48.152" dyno=web.1 connect=0ms service=24ms status=200 bytes=6143 protocol=https
我已经登录了我的Signin控制器,并且该呼叫肯定没有到达它。如果我只是在浏览器中键入/signin?error=1
,它就会毫无问题地到达控制器。
我尝试添加自定义AuthenticationFailureHandler,而不是使用.failureUrl()
。同样,它在本地运行良好(在使用Eclipse运行的Tomcat上,以及从命令行启动独立的Spring Boot启动),但在部署应用程序时则不行。
任何人都可以建议我可能做错了什么,或者另一种可能回避这个问题的方法吗?