在初次学习使用shiro框架的时候碰到了这个问题,具体报错情况如下:
[org.apache.shiro.authc.AbstractAuthenticator] - Authentication failed for token submission [org.apache.shiro.authc.UsernamePasswordToken - asdf, rememberMe=false]. Possible unexpected error? (Typical or expected login exceptions should extend from AuthenticationException).
java.lang.IllegalArgumentException: Illegal hexadecimal charcter s at index 1
at org.apache.shiro.codec.Hex.toDigit(Hex.java:156)
at org.apache.shiro.codec.Hex.decode(Hex.java:137)
at org.apache.shiro.codec.Hex.decode(Hex.java:107)s
....
原因:
有错误信息可知,这是一个认证失败错误,往后看,大概与封装用户信息的token有关,再往下看,java爆出的异常是非法16进制字符有问题==>shiro框架的加密/解密出了问题。
预判:
要么是shiro对toke进行了加密,而从数据库读取的数据并未加密,故匹配信息失败;
要么是shiro没有对token加密,而数据库读取的数据加了密,导致匹配失败;
还有一种可能就是,两边的加密方式不同,匹配失败。
解决办法:使两边的数据加密一致。
我的办法:因为我的mysql数据没有加密,所以我调整shiro的配置文件,去掉了加密模块,然后再跑,就正常了。
<bean id="shiroDbRealm" class="com.rgl.realm.shiroDbRealm">
<!-- <property name="credentialsMatcher">
<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<property name="hashAlgorithmName" value="MD5"/>
</bean>
</property> -->
<property name="cacheManager" ref="cacheManager"/>
</bean>
被我屏蔽掉的那段就是md5加密的调用配置。