使用自定义的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

    @Override
	protected 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 {

    @Override
    public 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 {
  
    @Bean
    public UserRealm userRealm(UserPasswordMatcher passwordMatcher) {
        UserRealm userRealm = new UserRealm();

        userRealm.setCredentialsMatcher(passwordMatcher);

        return userRealm;
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

宏集物联网工控屏通过 S7 ETH 协议采集西门子 1200 PLC 数据

前言 为了实现和西门子PLC的数据交互,宏集物联网HMI集成了S7 PPI、S7 MPI、S7 Optimized、S7 ETH等多个驱动来适配西门子200、300、400、1200、1500、LOGO等系列PLC。 本文主要介绍宏集物联网HMI如何通过S7 ETH协议采集西门子1200 PLC的数据,文中详细介…

办公软件WPS与Office的区别

临近计算机考试很多同学在纠结我是报wps好?还是ms office好?下面就来详细说说。 1、wps属于国内金山公司的办公软件,里面包含word、Excel和PPT。考试是2021年开始的! 2、MS(Microsoft 微软) office属于美…

网易游戏如何基于 Apache Doris 构建全新湖仓一体架构

导读:随着网易游戏品类及产品的快速发展,游戏数据分析场景面临着越来越多的挑战,为了保证系统性能和 SLA,要求引入新的组件来解决特定业务场景问题。为此,网易游戏引入 Apache Doris 构建了全新的湖仓一体架构。经过不…

精益生产转型攻略:如何平稳过渡,避免业务震荡?

在当今快速变化的市场环境中,越来越多的企业开始关注并尝试实施精益生产,以提升生产效率、降低成本并增强竞争力。然而,转型并非一蹴而就,如何在确保精益生产实施效果的同时,又避免对企业的现有业务流程和组织结构产生…

【C++进阶9】异常

一、C语言传统的处理错误的方式 终止程序,如assert 如发生内存错误,除0错误时就会终止程序返回错误码 需要程序员自己去查找对应的错误 z如系统的很多库的接口函数都是通 过把错误码放到errno中,表示错误 二、C异常概念 异常:函…

anaconda卸载过程中出现fail to run pre-unistall报错

问题: 在使用Uninstall-Anaconda3.exe卸载程序时,出现报错: 解决方案: 把文件夹移动到C盘用户文件夹后再运行卸载程序。即可正常运行程序。

ping 出现的结果判断

ICMP协议发送包的时候 常见的ping反馈结果: 连接建立成功,Reply from 目标地址 目标主机不可达,Destination host unreachable 直接不能出交换机,到达不了交换机 请求时间超时,Request timed out 服务器到交换机…

一名HR,在招聘嵌入式开发岗位,为什么感觉一年比一年难?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 1.嵌入式学用不一致, 高…

MySQL基础查询与复杂查询

基础查询 1、查询用户信息,仅显示用户的姓名与手机号,用中文显示列名。中文显示姓名列与手机号列。 2、根据商品名称进行模糊查询,模糊查询需要可以走索引,需要给出explain语句。使用explain测试给出的查询语句,需要显…

如何把mkv转成mp4?介绍一下将mkv转成MP4的几种方法

如何把mkv转成mp4?如果你有一个MKV格式的视频文件,但是需要将其转换为MP4格式以便更广泛地在各种设备和平台上播放和共享,你可以通过进行简单的文件格式转换来实现。转换MKV到MP4格式可以提供更好的兼容性,并确保你的视频文件能够…

vue2(vue-cli3x[vue.config.js])使用cesium新版(1.117.0)配置过程

看来很多解决方法都没有办法,最后终于。呜呜呜呜 这里我用的是vue-cli去搭建的项目的vue2 项目,其实不建议用vue2搭配cesium。因为目前cesium停止了对vue2的版本更新,现在默认安装都是vue3版本,因此需要控制版本,否则…

Rockchip RK3588 - Rockchip Linux Recovery rkupdate升级

---------------------------------------------------------------------------------------------------------------------------- 开发板 :ArmSoM-Sige7开发板eMMC :64GBLPDDR4 :8GB 显示屏 :15.6英寸HDMI接口显示屏u-boot &a…

【产品经理】订单处理9-台账库存管理

在订单处理过程中,台账库存的具体设计怎么做? 在订单处理过程中,分配仓库成功后要扣除仓库库存并计算商品缺货情况,仓库库存就是台账库存。 1,台账库存是针对某个仓库的库存,且台账库存只计算此商品SKU的库…

小马搬运物品-第13届蓝桥杯省赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第89讲。 小马搬运物品&…

C#/.NET量化开发实现财富自由【4】实现EMA、MACD技术指标的计算

听说大A又回到了2950点以下,对于量化交易来说,可能这些都不是事儿。例如,你可以预判到大A到顶了,你可能早就跑路了。判断逃顶还是抄底,最简单的方式就是判断是否顶背离还是底背离,例如通过MACD,…

华为5288 V5服务器安装BCLinux8U4手记

本文记录了华为5288 V5服务器安装BCLinux8U4操作系统的过程。 一、系统环境 1、服务器 华为FusionServer Pro 5288 V5服务器 2、操作系统 BCLinux-R8-U4-Server-x86_64-220725.iso 官网下载地址 sha256sum:1d31d3b8e02279e89965bd3bea61f14c65b9d32ad2ab6d4eb…

MySQL数据库基础练习系列——教务管理系统

项目名称与项目简介 教务管理系统是一个旨在帮助学校或教育机构管理教务活动的软件系统。它涵盖了学生信息管理、教师信息管理、课程管理、成绩管理以及相关的报表生成等功能。通过该系统,学校可以更加高效地处理教务数据,提升教学质量和管理水平。 1.…

uniapp获取证书秘钥、Android App备案获取公钥、签名MD5值

一、 uniapp获取证书秘钥 打开uniapp开发者中心下载证书打开cmd输入以下这段代码,下载提供查看到的密钥证书密码就可以了!下载证书在 java 环境下运行才可以 // your_alias 换成 证书详情中的别名,your_keystore.keystore 改成自己的证书文件…

炸裂行情,只涨指数难涨票!你的股票涨了吗?

今天的A股,让人愣住了,你知道是为什么吗?盘面上出现2个耐人寻味的重要信号,一起来看看: 1、今天A股冲高回落,很多人愣住了,别慌!主力增量在不断增加,7月的一波主线反弹正…

小程序web-view无法打开该页面的解决方法

问题:开发者工具可以正常打开,正式上线版小程序使用 web-view 组件测试时提示:“无法打开该页面,不支持打开 https://xxxxxx,请在“小程序右上角更多->反馈与投诉”中和开发者反馈。” 解决方法:需要配…