关于Shiro加salt报错的解决办法

Java_er 2017-01-11 10:41:45
ShiroSecurityRealm extends AuthorizingRealm
使用的是JDBC的Realm

protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken authcToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authcToken;

String username = (String) token.getPrincipal(); // 得到用户名
String password = new String((char[]) token.getCredentials()); // 得到密码

// System.out.println(username+","+ password);
if (StringUtils.isNotBlank(username)
&& StringUtils.isNotBlank(password)) {

Map<String, Object> params=new HashMap<>();
params.put("username", username);
params.put("password", password);


List<UserInfo> userInfoList = userInfoService.listUserByMap(params);
UserInfo userInfo=new UserInfo();
if(userInfoList!=null&&userInfoList.size()==1){//
userInfo = userInfoList.get(0);
}else{
return null;
}

SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(
userInfo.getUsername(), userInfo.getPassword(),getName());
info.setCredentialsSalt(ByteSource.Util.bytes(userInfo.getUsername()));// 盐值
return info;
} else {
return null;
}

}


action里面
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(userName, MD5Encode.encode(password+userName, "md5"));
try {
subject.login(token);

这样写为什么不行,总是抛IncorrectCredentialsException异常。我采用的加盐的办法是 用户密码+用户名 即用户名作为盐值。
...全文
440 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
梧桐1993 2017-01-19
  • 打赏
  • 举报
回复
你的盐是用户名吗?老哥 这一个set info.setCredentialsSalt(ByteSource.Util.bytes(userInfo.getUsername()));这个盐userInfo.getUsername()是不是get错了,检查一下
ttkforit 2017-01-18
  • 打赏
  • 举报
回复
引用 9 楼 Javainging 的回复:
[quote=引用 8 楼 moran_sky 的回复:] shiro会通过加密算法和盐生成加密字符串,然后和你数据库中的进行匹配,出问题很有可能是你生成的字符串和数据库中的不匹配。
我action里面算的喝数据库中是一样的,是对的。[/quote] 你有没有指定其它的加密格式,比如md5,shiro会根据这个把你的UsernamePasswordToken中的值计算获取摘要
鲨鱼也是鱼 2017-01-12
  • 打赏
  • 举报
回复
引用 4 楼 Javainging 的回复:
[quote=引用 1 楼 zhaoyachao123 的回复:] 你的加密可能不正确
加密不正确什么意思[/quote] 具体的不知道 比较加密什么都看不见,可能是编码的问题,也可能是你盐值不对,你debug 一下看看吧
Java_er 2017-01-12
  • 打赏
  • 举报
回复
引用 1 楼 zhaoyachao123 的回复:
你的加密可能不正确
加密不正确什么意思
Java_er 2017-01-12
  • 打赏
  • 举报
回复
引用 8 楼 moran_sky 的回复:
shiro会通过加密算法和盐生成加密字符串,然后和你数据库中的进行匹配,出问题很有可能是你生成的字符串和数据库中的不匹配。
我action里面算的喝数据库中是一样的,是对的。
ttkforit 2017-01-12
  • 打赏
  • 举报
回复
shiro会通过加密算法和盐生成加密字符串,然后和你数据库中的进行匹配,出问题很有可能是你生成的字符串和数据库中的不匹配。
Java_er 2017-01-12
  • 打赏
  • 举报
回复
引用 5 楼 zhaoyachao123 的回复:
[quote=引用 4 楼 Javainging 的回复:] [quote=引用 1 楼 zhaoyachao123 的回复:] 你的加密可能不正确
加密不正确什么意思[/quote] 具体的不知道 比较加密什么都看不见,可能是编码的问题,也可能是你盐值不对,你debug 一下看看吧[/quote] 密码跟数据库的存储的密码都是匹配的,后台结果可以查出来。我总觉得是shiro这快搞的有问题。
Java_er 2017-01-12
  • 打赏
  • 举报
回复
引用 2 楼 zwy0123 的回复:
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userInfo.getUsername(), userInfo.getPassword(),getName()); 这里的getName()是什么?值从哪里来的? 觉得是你的密码用盐加密出来的问题,你仔细检查一下
getName() 跟这个没啥关系的,这是父类的方法
ichavin 2017-01-11
  • 打赏
  • 举报
回复
其他没看出来什么毛病,就是值别传递错了
ichavin 2017-01-11
  • 打赏
  • 举报
回复
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userInfo.getUsername(), userInfo.getPassword(),getName()); 这里的getName()是什么?值从哪里来的? 觉得是你的密码用盐加密出来的问题,你仔细检查一下
鲨鱼也是鱼 2017-01-11
  • 打赏
  • 举报
回复
你的加密可能不正确

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧