我有一个使用Spring Security进行身份验证的web应用程序。在Tomcat 6中工作正常。根据业务需求的变化,我不得不将它部署到Tomcat 7上,但现在无法正常工作。
spring-security.xml(为简单起见,我更改了查询)
<form-login login-page="/redirect"
login-processing-url="/submitLogin"
username-parameter="j_username"
password-parameter="j_password"
authentication-failure-handler-ref="loginFailureHandler"
authentication-success-handler-ref="loginSuccessHandler" />
<authentication-manager>
<authentication-provider>
<jdbc-user-service
data-source-ref="sybaseDataSource"
users-by-username-query="SELECT distinct EnterpriseID as username, 'password' as password, 1 as enabled FROM users where id = ?"
authorities-by-username-query="SELECT ? as id, 'ROLE_USER' as authority"
<!-- I know, it shouldnt be like this, just for the sake of the user having an authority -->
/>
</authentication-provider>
</authentication-manager>
这实际上是一个重定向,其中填充了用户和密码,并使用javascript(jquery)提交了表单
<form method="POST" action="/submitLogin" id="login-form-sso">
<input type="text" name='j_username' value="${user}"/>
<input type="text" name='j_password' value="password"/>
</form>
$(document).ready(function(){
$("#login-form-sso").submit();
});
在Tomcat 7中部署时,它总是转到loginFailureHandler
。调试后,我注意到Spring security没有"看到"用户名,而是试图使用"
org.springframework.jdbc.core.JdbcTemplate , Executing prepared SQL statement [SELECT distinct EnterpriseID as username, 'password'
org.springframework.jdbc.datasource.DataSourceUtils , Fetching JDBC Connection from DataSource
org.springframework.jdbc.datasource.DataSourceUtils , Returning JDBC Connection to DataSource
org.springframework.security.provisioning.JdbcUserDetailsManager , Query returned no results for user ''
org.springframework.security.authentication.dao.DaoAuthenticationProvider , User '' not found
org.springframework.beans.factory.support.DefaultListableBeanFactory , Returning cached instance of singleton bean 'sessionRegistry'
同样,这在Tomcat 6中工作得非常好。我还检查了JSP表单,它确实包含用户凭据,由于某种原因,看起来Spring安全无法找到它。
谁能告诉我正确的方向?谢谢你的建议。由于UPDATE:我认为过滤器链上的一个过滤器是罪魁祸首,它从请求体中消费参数。
我们经历了同样奇怪的行为。我们从表单中只收到空值。
结果是在解释server.xml-File中的Connector-Configuration中的maxpostsize参数时发生了变化。从Tomcat Version 7.0.63开始,maxPostSize="0"确实被解释为最大Postsize为零字节。直到7.0.63版本maxPostSize="0"表示无限的最大投递大小。设置maxPostSize="-1"在我们的例子中解决了这个问题。
也许这个答案可以帮助某人…
经过几天的谷歌搜索,痛苦的调试,创建自定义过滤器和tomcat配置,我注意到我所有的表单都不工作,我的控制器都得到NULL值。
我尝试了另一个版本的Tomcat(我有apache-tomcat-7.0.64并下载了apache-tomcat-7.0.47),它工作了。
问题解决了。保存工作。