java - Spring Security - 从 Tomcat 6 部署到 Tomcat 7 时凭据错误

标签 java jsp spring-mvc tomcat spring-security

我有一个使用 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 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 Security 似乎无法找到它。

谁能给我指出正确的方向?感谢您的投入。 谢谢

更新:我认为过滤器链上的过滤器之一是罪魁祸首,它使用了请求正文中的参数。将进一步调查。

最佳答案

我们遇到了同样的奇怪行为。我们从表单中只收到空值。

事实证明,在解释 server.xml 文件中的连接器配置中的 maxPostSize 参数时发生了变化。 从 Tomcat 版本 7.0.63 开始,maxPostSize="0"确实被解释为零字节的最大 Postsize。直到版本 7.0.63 maxPostSize="0"意味着无限的最大 postsize。 设置 maxPostSize="-1"解决了我们案例中的问题。

也许这个答案可能对某人有帮助...

关于java - Spring Security - 从 Tomcat 6 部署到 Tomcat 7 时凭据错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32882399/

相关文章:

java - 单元测试应该测试依赖交互吗?

java - 如何在 Java 中创建命令行应用程序?

java - 在上传到 Firebase 存储之前重命名图片

java - 如何让两个不同的 @Provider 在 Dagger 2 中注入(inject)相同的 @Singleton?

java - 有ehcache jsp标签吗?

java - Servlet 发送请求后未正确响应

java - 如何创建一个与我的桌面看起来一样的 Java Web 应用程序?

spring - 如何开始使用服务器端 - Java - Spring Framework

java - Spring未初始化bean

spring - 从数据库设置 Spring @Scheduled 配置的值