shiro异常:IncorrectCredentialsException

本文深入探讨了在使用Apache Shiro框架时遇到的密码认证问题。即使配置了credentialsMatcher并确保了加密算法和散列次数一致,仍遭遇IncorrectCredentialsException错误。通过对比AuthenticationToken和AuthenticationInfo中的凭据,发现两者相同却依然报错。最终,作者采用在登录控制器中手动加密密码的方法解决了这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个困扰我n多回的大bug,

如果是配置了credentialsMatcher对密码进行加密,但是数据库存储的密码是明文的话,会报异常AuthenticationException,然后出一条odd ...

但是我的情况是配置了credentialsMatcher,密码也进行加密了,并且加密算法、散列次数都一一对应,但就是报错IncorrectCredentialsException,也就是密码认证错误。

首先在shiro.xml中配置的credentialsMatcher:

	<bean id="userRealm" class="shiro.security.UserRealm">
		<!--引入的credentialsMatcher对密码进行加密-->
		<property name="credentialsMatcher" ref="credentialsMatcher" />
	</bean>
	<bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
		<!--加密算法-->
		<property name="hashAlgorithmName" value="md5" />
		<!--散列次数-->
		<property name="hashIterations" value="1" />
	</bean>

没有毛病,然后给password加密的PasswordHelper.java:

public class PasswordHelper {
    private String algorithmName = "md5";
    private final int hashIterations = 1;

    public String encryptPassword(String password) {
    	//没有使用salt
        SimpleHash newPass = new SimpleHash(algorithmName, password,null, hashIterations);
        return newPass.toString();
    }
}

加密算法,散列次数都可以对象,也没有毛病。

然而输入正确的用户名、密码后,直接报错IncorrectCredentialsException,我都快崩溃了,

调用subject.login(),shiro会对用户名密码进行匹配,匹配的过程是比较存储在AuthenticationToken和AuthenticationInfo存储的用户名密码。

分别取出AuthenticationToken和AuthenticationInfo里面的credential在控制台打印,明明都是一样的,还是报错IncorrectCredentialsException。

实在是没有办法了,只能不再配置credentialsMatcher,然后手动对密码加密,也就是在前台接收password后,在LoginController中对密码进行加密,然后存入AuthenticationInfo,在从数据库中取出加密后的password,存入AuthenticationInfo就ok了。

这也算是曲线救国,没有办法的事。。。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值