Spring security/hibernate:即使是正确的凭据也不正确?

Posted

技术标签:

【中文标题】Spring security/hibernate:即使是正确的凭据也不正确?【英文标题】:Spring security/hibernate: Bad credentials even if they're right? 【发布时间】:2013-02-05 21:54:09 【问题描述】:

嘿,我的基于 springsecurity 的登录有点混乱

我不断收到错误“凭据错误”

这是我的用户表:

![用户表][1]

这是我来自 applicationContext 的数据源:

<!-- database driver/location -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/ams" />
    <property name="username" value="root" />
    <property name="password" value="root" />
</bean>

还有我的securityContext:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:security="http://www.springframework.org/schema/security"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
              http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
              http://www.springframework.org/schema/security 
              http://www.springframework.org/schema/security/spring-security-3.0.xsd">

    <!-- <security:http auto-config="true" access-decision-manager-ref="accessDecisionManager"> -->
    <security:http auto-config="true">
        <security:intercept-url pattern="/login/login.do" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:intercept-url pattern="/login/doLogin.do" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:intercept-url pattern="/lib/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:intercept-url pattern="/css/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:intercept-url pattern="/images/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:intercept-url pattern="/resources/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:intercept-url pattern="/**" access="IS_AUTHENTICATED_REMEMBERED" />
        <security:form-login login-page="/login/login.do" authentication-failure-url="/login/login.do?login_error=true" default-target-url="/test/showTest.do"/>
        <security:logout logout-success-url="/login/login.do" invalidate-session="true" />
        <security:remember-me key="rememberMe"/>
    </security:http>    


    <security:authentication-manager>
        <security:authentication-provider>
            <security:jdbc-user-service data-source-ref="dataSource" 
            users-by-username-query="select USERNAME as username, PASSWORD as password, DELETED as deleted from ams.user where USERNAME=?"
            authorities-by-username-query="
                select distinct user.USERNAME as username, permission.NAME as authority 
            from scu.user, scu.user_role, scu.role, scu.role_permission, scu.permission
            where user.ID=user_role.USER_ID AND user_role.ROLE_ID=role_permission.ROLE_ID AND role_permission.PERMISSION_ID=permission.ID AND user.USERNAME=?"/>
            <!-- security:password-encoder ref="passwordEncoder" /> -->
        </security:authentication-provider>
    </security:authentication-manager>

    <bean id="passwordEncoder"
        class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
        <constructor-arg value="256" />
    </bean>
</beans>

当我尝试登录时:admin 和 init01

它给了我错误的错误凭据... =(

欢迎提出任何建议!!!

【问题讨论】:

【参考方案1】:

authentication-provider 中的 password-encoder 引用已被注释掉。如果您使用散列密码(应该如此),则需要密码编码器。还要检查this answer,特别是关于编写测试以确保您使用的密码编码器与您存储在数据库中的密码编码器匹配的第 2 点。

您可能还想检查 this answer on using bcrypt 作为普通 SHA 哈希的更安全替代方案。

【讨论】:

哈希密码编码器不是问题,我只是把它注释掉了,这样你就可以看到“真正的”密码实际上是什么......当我使用它或什么时候它不会改变任何东西我不使用它 很可能是问题所在。没有它,它根本无法工作,除非它生成的字符串与您数据库中的字符串完全匹配,否则它将无法使用它。因此链接。检查日志,如果有疑问,请使用调试器并设置断点here。如果由于密码不匹配而导致身份验证失败,您还应该看到该日志消息。 我知道 init01 的哈希值,(它是与其他用户一起使用的那个)并且它肯定也不起作用但是谢谢我一定会经历那个 带调试器?在 IDE 中将源 jar 添加到项目中,并使用标准 Java 远程调试。例如,如果您正在运行 tomcat,请使用 catalina.sh debug 启动它。然后连接到进程 - Intellij 和 Eclipse 都让它变得非常容易。【参考方案2】:

您的密码正在被散列。如果您添加密码“init01”,实际上意味着原始密码的哈希是“init01”,因为 Spring 对提供的密码进行哈希处理并与您输入的密码匹配。所以 SHA('init01') 不是 'init01'

【讨论】:

不,我只是用纯文本写的,所以你可以看到我输入的内容,加密后不会改变任何东西......

以上是关于Spring security/hibernate:即使是正确的凭据也不正确?的主要内容,如果未能解决你的问题,请参考以下文章

Spring security/hibernate:即使是正确的凭据也不正确?

如何使用 Spring Security、Hibernate 和行级 ACL 进行分页

错误:运算符不存在:字符变化 = bytea

如何在 JSP 页面中从 Java 类中设置 hashmap 的值以便在控制器中进一步使用

Spring框架系列 - Spring和Spring框架组成

你了解Spring从Spring3到Spring5的变迁吗?