使用自定义的shiro密码匹配器CredentialsMatcher完成密码验证

今天突然想研究一下shiro怎么匹配用户的密码。

我们使用shiro的API登录时,会先创建一个令牌对象,而经常用的令牌对象是UsernamePasswordToken,把用户输入的用户名和密码作为参数构建一个UsernamePasswordToken,然后通过Subject.login()登录。

// shiro登录认证
// 1、创建令牌
UsernamePasswordToken token = new UsernamePasswordToken(username, password);// 获取Subject对象
Subject subject = SecurityUtils.getSubject();// 登录
subject.login(token);

而在几经周转之下,最后会调用Realm的getAuthenticationInfo()方法获取认证信息。

一般在这里,我们会根据用户输入的用户名/手机号等查询数据库,然后把查询的结果封装成AuthenticationInfo对象返回,一般直接使用其子类SimpleAuthenticationInfo

    @Overrideprotected SimpleAuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) {// 得到令牌UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;// 从token中获取用户名String username = token.getUsername();User user = userService.selectByUsername(username);return new SimpleAuthenticationInfo(user, user.getPassword(), username);}

然后神奇的事发生了,当密码输入错误的时候,居然会登录失败,我们并没有写对比密码的代码。

那么shiro是如何知道我们输的密码对不对呢?

经过浏览官网的相关说明,发现一个叫CredentialsMatcher的接口,这个接口的中文含义就是密码匹配器

而shiro默认通过其实现类SimpleCredentialsMatcher来进行输入的密码和数据库的密码的比较(简单的等值比较)。 

当数据库存储的密码不是明文时,就不能使用默认的SimpleCredentialsMatcher了,否则就算密码对了也会匹配不上。

这时候就需要自定义CredentialsMatcher来完成密码比较了~

import cn.edu.sgu.www.mhxysy.util.PasswordEncoder;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.CredentialsMatcher;
import org.springframework.stereotype.Component;/*** 密码匹配器* @author heyunlin* @version 1.0*/
@Slf4j
@Component
public class UserPasswordMatcher implements CredentialsMatcher {@Overridepublic boolean doCredentialsMatch(AuthenticationToken authenticationToken, AuthenticationInfo authenticationInfo) {UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;SimpleAuthenticationInfo simpleAuthenticationInfo = (SimpleAuthenticationInfo) authenticationInfo;// 得到用户输入的密码String password = new String(token.getPassword());// 得到数据库密码String encodedPassword = simpleAuthenticationInfo.getCredentials().toString();return PasswordEncoder.matches(password, encodedPassword);}}

最后,在配置Realm的bean时,需要通过@Bean注解定义,因为要设置密码匹配器~

/*** shiro配置类* @author heyunlin* @version 1.0*/
@Configuration
public class ShiroConfig {@Beanpublic UserRealm userRealm(UserPasswordMatcher passwordMatcher) {UserRealm userRealm = new UserRealm();userRealm.setCredentialsMatcher(passwordMatcher);return userRealm;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/363231.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十二、Yocto集成ROS2 app程序(package)

文章目录 Yocto集成ROS2 app程序1. 添加一个ros2 package应用程序2. 添加bb文件集成app应用程序 Yocto集成ROS2 app程序 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第十二篇文章: 一、yocto 编译raspberrypi 4B并启动 二、yocto 集成ros2(基于raspberrypi…

stable diffusion 模型和lora融合

炜哥的AI学习笔记——SuperMerger插件学习 - 哔哩哔哩接下来学习的插件名字叫做 SuperMerger,它的作用正如其名,可以融合大模型或者 LoRA,一般来说会结合之前的插件 LoRA Block Weight 使用,在调整完成 LoRA 模型的权重后使用改插件进行重新打包。除了 LoRA ,Checkpoint 也…

Kafka入门到精通(三)-Kafka

Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动&#xf…

pgsql的套接字文件不存在

问题:psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory 解决方式: 检查 postgresql.conf 文件中的 unix_socket_directories 设置,确保它包含 /tmp 或者你期望的目录。 重…

文本分析|小白教程

在信息爆炸的时代,文本数据无处不在,如何从这些海量的文字中提炼出有价值的信息呢?答案就是——文本分析。文本分析,简单来说,就是对文本数据进行深度的研究和分析。它能够从看似普通的文字中,提取出主题、…

sheng的学习笔记-AI-高斯混合模型(GMM)

AI目录:sheng的学习笔记-AI目录-CSDN博客 需要学习前置知识: 聚类,可参考 sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 EM算法,可参考 sheng的学习笔记-AI-EM算法-CSDN博客 贝叶斯,可参考 sheng的学习笔记-AI-…

关于使用绿联 USB-A转RJ45 2.5G网卡提速的解决问题

问题 网络下载速率低 网线是七类网线,外接的USB网卡驱动 我的自带网卡是 I219v 在嵌入了2.5G网络后一直无法到达1.5G以上。 平均测速300~500M 解决方案 更新了USB的网卡驱动 禁用了 I219-V的驱动。测速即可 USB驱动下载地址 https://download.csdn.net/downlo…

分销裂变实战:PLG模式如何助力企业突破增长瓶颈

在竞争激烈的商业环境中,企业如何快速、有效地实现增长,一直是业界关注的焦点。近年来,分销裂变作为一种新兴的商业模式,凭借其独特的优势,逐渐受到企业的青睐。而产品驱动增长(PLG)模式更是为分…

JAVA:Word2Vec的使用

1、简介 Word2Vec是 Google 在 2013 年年中开源的一款将词表征为实数值向量的高效工具, 其利用深度学习的思想,可以通过训练,把对文本内容的处理简化为 K 维向量空间中的向量运算,而向量空间上的相似度可以用来表示文本语义上的相似度。 Wo…

Maven deploy上传远程私服失败

Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) on project 你的项目: Cannot deploy artifacts when Maven is in offline mode 解决方案&#xff1a; 1.IDEA把这个钩子去掉 2. settings.xml里把 <offline>标…

聊聊啥项目适合做自动化测试

作为测试从业者&#xff0c;你是否遇到过这样的场景&#xff0c;某天公司大Boss找你谈话。 老板&#xff1a;小李&#xff0c;最近工作辛苦了 小李&#xff1a;常感谢您的认可&#xff0c;这不仅是对我个人的鼓励&#xff0c;更是对我们整个团队努力的认可。我们的成果离不开每…

填完高考志愿后,每天必须要做的三件事!

填完志愿后是等录取通知书吗&#xff1f;错&#xff0c;大错特错&#xff0c;今天老师特别提醒大家&#xff0c;每天要做的3件事非常重要&#xff0c;一定要点赞收藏起来。 第一&#xff0c;每天早上9点登录你们省教育考试院的官网&#xff0c;凭个人的账号和密码查看招生考试…

PTA—C语言期末复习(选择题)

1. 按照标识符的要求&#xff0c;&#xff08;A&#xff09;不能组成标识符。 A.连接符 B.下划线 C.大小写字母 D.数字字符 在大多数编程语言中&#xff0c;标识符通常由字母&#xff08;包括大写和小写&#xff09;、数字和下划线组成&#xff0c;但不能以数字开头&#xff0c…

[数据集][目标检测]棉花叶子害虫检测数据集VOC+YOLO格式595张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;595 标注数量(xml文件个数)&#xff1a;595 标注数量(txt文件个数)&#xff1a;595 标注类别…

预制聚氨酯保温管:高效节能管道保温

在现代能源输送领域&#xff0c;预制聚氨酯保温管正凭借其出色的性能&#xff0c;成为保障能源高效传输的关键角色。 预制聚氨酯保温管&#xff0c;顾名思义&#xff0c;其核心在于聚氨酯保温层。这一独特的设计赋予了它卓越的保温性能。聚氨酯材料具有极低的导热系数&#xff…

2024上海MWC 参展预告 | 未来先行,解锁数字化新纪元!

一、展会介绍——2024世界移动通信大会 2024年世界移动通信大会上海(MWC上海)将于6月26日至28日在上海新国际博览中心举行。 本届大会以“未来先行(Future First)”为主题聚焦“超越5G”、“数智制“人工智能经济’造”三大热点话题。届时将在包括超级品牌馆(Super Hall)在内…

Charles网络抓包工具安装和web抓包(一)

目录 概述 抓包工具对比 安装 下载 web抓包配置 按键说明 前言-与正文无关 ​ 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停下脚步&#…

JS(JavaScript)事件处理(事件绑定)趣味案例

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

天翼云服务器80、443等特殊端口无法访问原因记录

之前阿里云、腾讯云的服务器上&#xff0c;想要用域名访问项目简单配置就好了&#xff0c;这次甲方直接买的翼云的服务器&#xff0c;配置了半天&#xff0c;防火墙端口80、443端口开放了&#xff0c;控制台安全组也添加了&#xff0c;就是不能用域名或IP直接访问&#xff0c;配…

软考《信息系统运行管理员》-1.4 常见的信息系统

1.4 常见的信息系统 常见的信息系统综述 财务系统 财务信息系统会计信息系统 办公自动化系统业务处理系统生产管理系统ERP系统客户关系管理系统人力资源系统 会计信息系统 主要任务是保证记账的正确性。 订单处理子系统库存子系统会计应收/应支系统总账子系统 财务信息系…