Spring Security - 从 Tomcat 6 部署到 Tomcat 7 时凭据错误
Posted
技术标签:
【中文标题】Spring Security - 从 Tomcat 6 部署到 Tomcat 7 时凭据错误【英文标题】:Spring Security - Bad credentials when deploying from Tomcat 6 to Tomcat 7 【发布时间】:2015-12-29 04:50:43 【问题描述】:我有一个使用 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>
来自 jsp 的表单:(这实际上是一个重定向,其中填充了用户和密码,并使用 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 安全“看到”,试图用 ''
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 安全性找不到它。
谁能指出我正确的方向?感谢您的意见。 谢谢
更新:我认为过滤器链上的过滤器之一是罪魁祸首,消耗了请求正文中的参数。将进一步调查。
【问题讨论】:
你的 Spring-security 版本是什么?你有休眠功能吗? 弹簧安全 3.2.2,瓷砖 2.2.2。没有休眠。 我有一些 XML 代码将引用一个 Java 文件,您可以在那里编写您的 findByUsername(String email) 方法。这可能对你有用。如果你有休眠,这将是有益的,因为这需要用户对象。如果你想要它,让我知道。 浏览器上 j_username 的视图源是什么?我 value='' 被通过了?检查浏览器上的 HTTP 手表。尝试删除 value=$user 作为测试并输入用户 ID 【参考方案1】:我们遇到了同样的奇怪行为。我们从表单中只收到空值。
事实证明,在 server.xml-File 中的 Connector-Configuration 中解释 maxPostSize-Parameter 发生了变化。 从 Tomcat 版本 7.0.63 开始,maxPostSize="0" 确实被解释为最大 Postsize 为零字节。直到版本 7.0.63 maxPostSize="0" 表示无限的最大 postsize。 设置 maxPostSize="-1" 解决了我们案例中的问题。
也许这个答案可能对某人有所帮助......
【讨论】:
一篇很有帮助的帖子。非常感谢。你救了我的命:P【参考方案2】:经过几天的谷歌搜索、痛苦的调试、创建自定义过滤器和 tomcat 配置,我注意到我的所有表单都无法正常工作,并且我的控制器都获得了 NULL 值。
我尝试了另一个版本的 Tomcat(我有 apache-tomcat-7.0.64 并下载了 apache-tomcat-7.0.47)并且它工作正常。
问题解决了。作业已保存。
【讨论】:
以上是关于Spring Security - 从 Tomcat 6 部署到 Tomcat 7 时凭据错误的主要内容,如果未能解决你的问题,请参考以下文章
从 stark-security 升级到 spring 安全插件
spring-security-oauth2 - 从资源服务器检查ClientDetails
Grails - grails-spring-security-rest - 无法从 application.yml 加载 jwt 机密