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

news2024/10/7 20:37:11

今天突然想研究一下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.coloradmin.cn/o/1874673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爆款短视频素材库有哪些?分享几个容易火的视频素材网站

当今自媒体时代,每位内容创作者都渴望制作出下一个爆款短视频。你是否在寻找那些能让你的视频迅速蹭热度的顶级素材库?本文将为你介绍几个视频素材库,它们或许能成为你成功的秘密武器。首先要提的,自然是著名的国内素材库——蛙学…

财务RPA与数字化转型——财务RPA如何促进企业的数字化转型

在数字化时代,企业面临着推动创新、提高效率的巨大挑战。RPA财务机器人作为智慧财务不可或缺的新动能,不仅能够优化财务流程,还能够在整个企业中引领数字化变革。本文金智维将深入探讨财务RPA如何成为企业数字化转型的战略利器,为…

docker 搭建 AI大数据模型 --- 使用GPU

docker 搭建 AI大数据模型 — 使用GPU方式 搭建本地大模型,最简单的方法!效果直逼GPT 服务器GPU系统HP580 G8P40Rocky9.2 安装程序AnythingLLM前端界面Open WebUIChatOllamaollama 一、AnythingLLM 介绍 AnythingLLM 是 Mintplex Labs Inc. 开发的一…

自然语言处理-BERT处理框架-transformer

目录 1.介绍 2.Transformer 2.1 引言 2.2 传统RNN网络的问题 2.3 整体架构 2.4 Attention 2.5 Self-Attention如何计算 3.multi-headed机制 4. BERT训练方法 1.介绍 BERT:当前主流的解决框架,一站式搞定NLP任务。(解决一个NLP任务时的考虑…

STM32 IWDG(独立看门狗)

1 IWDG简介 STM32有两个看门狗:一个是独立看门狗(IWDG),另外一个是窗口看门狗。独立看门狗也称宠物狗,窗口看门狗也称警犬。本文主要分析独立看门狗的功能和它的应用。 独立看门狗用通俗一点的话来解释就是一个12位的…

访问外网的安全保障——反向沙箱

反向沙箱作为一种网络安全技术,其核心理念在于通过构建一个隔离且受控的环境,来有效阻止潜在的网络威胁对真实系统的影响。在当今日益复杂的网络环境中,如何借助反向沙箱实现安全上网,已成为众多用户关注的焦点。 随着信息化的发…

解决ubuntu18.04 安装vscode 报依赖库错误,以及打不开终端的问题。

其实很简单,ubuntu18.04太老了,官网最新版本的vscode对ubuntu18.04会有些依赖库的问题。 一顿查资料后发现2023.11月的1.85版本正常使用,于是完美解决。 下载链接 Visual Studio Code November 2023 点击这里下载。 下载完成,…

STM32 I2C总线锁死原因及解决方法

本文介绍STM32 I2C总线锁死原因及解决方法。 在使用STM32 I2C总线操作外设时,有时会遇到I2C总线锁死(I2C总线为Busy状态)的问题,即便复位MCU也无法解决,本文介绍其锁死的原因和解决方法,并给出相应的参考代…

【Redis四】主从复制、哨兵以及Cluster集群

目录 一.主从复制、哨兵、集群的区别 二.Redis主从复制 1.作用 2.原理 3.流程 三.搭建Redis 主从复制 1.源码编译安装以及配置文件修改 1.1.修改 Redis 配置文件(Slave节点操作) 2.验证主从复制 2.1.在Master节点上看日志 2.2.在Master节点上…

学习记录696@网络安全之认证、报文完整性、密钥分发与证书

认证 即通信双方如何认证对方身份。 这种情况存在问题:trudy可以伪造A的IP地址。就算带上密码也可能被截获,用于重放攻击。 解决重放攻击的办法是随机数挑战,每次认证时,B都发一个挑战码给A。A加密后再传给B,如果B…

学习阳明心学,需要下真功夫,持续用功

阳明心学是功夫之学,看到善的就发扬光大,看到恶的就立即改正,这才是真功夫

深度解析RocketMq源码-消费者索引ConsumeQueue

1.绪论 rocketmq的broker中关于消息持久化的组件主要包含三个,分别是:持久化消息到文件中的组件commitLog;根据消息key索引commitLog日志的indexFile;消费者根据topic和queueId查询commitLog日志的consumeQueue。前面已经介绍com…

Logback-打印方法名及代码行号

背景 公司产品使用了logback作为日志输出框架,日志输出的pattern里配置了打印调用方法名及代码行号的配置,但是实际输出的日志方法名总是显示? 在强迫症的驱使下,开启了探秘之旅 Logback版本 1.2.3 项目中Logging.pattern配置如下&#xff1…

51单片机STC89C52RC——11.1 蜂鸣器播放音乐

目录 目的/效果 一,STC单片机模块 二,蜂鸣器 2.1 介绍 2.2 板子位置电路图 2.3 发声原理 2.4 音符和频率 三,创建Keil项目 四,代码 4.1 乐谱代码 4.1.1 《义勇军进行曲》 4.1.2 《天空之城》 4.1.3 《小美满》 4.1.…

6.26.4.3 条件生成对抗和卷积网络用于x射线乳房质量分割和形状分类

一种基于条件生成对抗网络(conditional Generative Adversarial Networks, cGAN)的乳房肿块分割方法。假设cGAN结构非常适合准确地勾勒出质量区域,特别是当训练数据有限时。生成网络学习肿瘤的内在特征,而对抗网络强制分割与基础事实相似。从公开DDSM数据…

【移动应用开发期末复习】第五/六章例题

系列文章 第一章——Android平台概述 第一章例题 第二章——Android开发环境 第二章例题 第三章 第三章例题 第四章 第五/六章 系列文章RadioGroup 是一个Android特有的布局容器,用于包含多个RadioButton组件。当用户选择其中一个RadioButton时,RadioGroup会自动取消其他Rad…

CS-隐藏防朔源-数据转发-iptables(Linux自带的防火墙)

免责声明:本文仅做技术交流与学习... 目录 准备环境: 1-iptables转发机设置转发: 2-CS服务器配置iptables服务器的IP 准备环境: 两台外网服务器. --iptables服务器就是做一个中转...封了中转就没了... 1-iptables转发机设置转发: iptables -I INPUT -p tcp -m tcp --dport 8…

【FFmpeg】avio_open2函数

【FFmpeg】avio_open2函数 1.avio_open21.1 创建URLContext(ffurl_open_whitelist)1.1.1 创建URLContext(ffurl_alloc)1.1.1.1 查找合适的protocol(url_find_protocol)1.1.1.2 为查找到的URLProtocol创建UR…

【前端项目笔记】6 参数管理

参数管理 效果展示: 在开发功能之前先创建分支goods_params cls 清空终端 git branch 查看所有分支 git checkout -b goods_params 新建分支goods_params git push -u origin goods_params 把本地的新分支推送到云端origin并命名为goods_params 参数管理需要维…

报餐小程序可以运用在饭堂的哪方面

随着科技的快速发展,智能化、信息化的管理方式逐渐渗透到我们日常生活的方方面面。在饭堂管理中,报餐小程序的应用为传统的餐饮管理方式带来了革命性的变革。本文将探讨报餐小程序在饭堂管理中的应用及其带来的优势。 一、报餐小程序的基本功能 报餐小程…