我刚从Spring Security 3.2.0.RC1升级到3.2.0.RC2。在RC1下一切正常。在RC2下,我的自定义登录页面不再有效。单击“登录”按钮后,刚刚重新登录登录页面。如果提交了无效凭证(或没有凭据),它也会重新显示,而不会显示任何错误消息。如果凭据不正确,它将正确显示错误消息。
有趣的是,如果我改变:
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
// @formatter:off
httpSecurity
.authorizeRequests()
.antMatchers("/restricted/**").hasRole("admin"))
// all requests must be authenticated
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/myLoginUrl.request")
.failureUrl("/myLoginUrl.request?error")
.permitAll()
.and()
.logout()
.permitAll()
.logoutSuccessUrl("/myLoginUrl.request")
;
// @formatter:on
}
为:
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
// @formatter:off
httpSecurity
.authorizeRequests()
.antMatchers("/restricted/**").hasRole("admin"))
// all requests must be authenticated
.anyRequest().authenticated()
.and()
.formLogin()
.permitAll()
.and()
.logout()
.permitAll()
.logoutSuccessUrl("/myLoginUrl.request")
;
// @formatter:on
}
默认的Spring Security登录页面显示并有效。我查看了默认页面的来源,并将其与我的自定义页面进行了比较,似乎使用相同名称的字段调用相同的操作。
如果我单步执行调试器,我发现在AntPathMatcher.java中,公共布尔匹配(HttpServletRequest请求):
String url = getRequestPath(request)
使用我的自定义登录页面时返回的网址是“/ error”。 getRequestPath()只返回附加到request.getPathInfo()的request.getServletPath()。我不确定为什么升级到RC2会导致返回“/ error”。
答案 0 :(得分:1)
我改变了三件让它发挥作用的事情。
1)在表单中添加了一个CSRF隐藏字段:
<input type="hidden" name="${_csrf.parameterName}"
value="${_csrf.token}" />
2)表单方法的大写POST:
<form action="login" method="POST">
3)将loginProcessingUrl明确添加到配置中:
.formLogin()
.loginPage("/myLoginUrl.request")
.loginProcessingUrl("/login")
.failureUrl("/myLoginUrl.request?error")
.permitAll()