Shiro身份验证抛出AuthenticationException异常,解决方案[亲测有效]

Shiro身份验证抛出AuthenticationException异常,解决方案[亲测有效]出现这个异常的原因是因为身份验证出错了,但是我觉得我写的Realm应该没什么错误,最后折腾了一会,翻看了一下Shiro的一些源码,终于知道出现这个问题的原因了,于是想将过程记录下来。 即可解决问题。

大家好,欢迎来到IT知识分享网。

image

问题

在学习Shiro的时候,遇到Shiro抛出org.apache.shiro.authc.AuthenticationException异常,完整异常如下:

org.apache.shiro.authc.AuthenticationException: Authentication failed for token submission [org.apache.shiro.authc.UsernamePasswordToken - xue8, rememberMe=false].  Possible unexpected error? (Typical or expected login exceptions should extend from AuthenticationException).

IT知识分享网

出现这个异常的原因是因为身份验证出错了,但是我觉得我写的Realm应该没什么错误,最后折腾了一会,翻看了一下Shiro的一些源码,终于知道出现这个问题的原因了,于是想将过程记录下来。

解决

我在Realm的身份证验证方法doGetAuthenticationInfo添加断点进行调试

image

发现是从
authenticationToken获取用户
密码
getCredentials()的时候出问题了,这就奇怪了,获取
用户名
getPrincipal()的时候没问题,而且通过查看
authenticationToken的源码,发现他们两个是一样的东西

image
image

用户名和密码传给
doGetAuthenticationInfo的时候都是成功的,那为什么会出错呢?在调试
doGetAuthenticationInfo的时候,发现了username和password的储存方式不一样

image

username是以字符串String的类型储存的,而password是以字符数组char[]类型储存的,那会不会是因为这个问题造成的呢,而且在
subject.login(token)方法中,用户名和密码都是以字符串String储存在token中的,

image

为什么到了
doGetAuthenticationInfo就变了呢,于是我继续查看了
UsernamePasswordToken的源码,会不会是因为这个对象将密码的字符串类型转成char[]类型呢

image

通过查看源码,看到了确实是
UsernamePasswordToken将传入的密码password从String字符串类型转成了char[]字符数组类型,到这里我也就明白了,在
Realm
doGetAuthenticationInfo方法中,传入的
AuthenticationToken authenticationToken用户名是以String方式储存的而密码是以Char[]储存的,用接收String的方式去接收Char[]类型数据肯定就不行了呢,所以我将密码改成用Char[]接收,如下

image

即可解决问题。

原文地址:ddnd.cn/2019/02/01/…

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/13186.html

(0)
上一篇 2023-03-21 09:00
下一篇 2023-03-21 11:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信