若依(spring-cloud)修改登陆密码加密算法

文章目录

  • 前言
  • 一、解决办法
  • 二、解决过程
    • 1 为啥要改加密算法
    • 2 找不到校验代码
  • 总结


前言

若依是一套快速集成各种中间件的配套 Java 后端框架,本文旨在描述修改其登陆的加密算法。文章的大前提是后端框架是若依哈,不是的话可以跳过了~!

文章创作原因:系统针对登陆密码是密文存储,而在登陆时的校验规则却在登录方法没找到这块的代码,导致一开始修改时摸不着头。


提示:以下是本篇文章正文内容,下面案例可供参考

一、解决办法

先说解决办法,在 SecurityConfig 这个文件中将原有的加密算法的 bean 注释掉,然后创建自己的加密算法的 bean 就行,再将 authenticationProvider 方法设置密码加密的bean对象改成自己定义的方法即可。

   /*** 强散列哈希加密实现*//*@Beanpublic BCryptPasswordEncoder bCryptPasswordEncoder() {return new BCryptPasswordEncoder();}*//*** 自定义加密算法* */@Beanpublic TestPasswordEncoder testPasswordEncoder() {return new TestPasswordEncoder();}/*** 身份认证接口*/@Beanpublic DaoAuthenticationProvider authenticationProvider() {DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();authProvider.setUserDetailsService(userDetailsService);authProvider.setPasswordEncoder(testPasswordEncoder());return authProvider;}

自定义的加密类需要实现org.springframework.security.crypto.password.PasswordEncoder,然后重写两个方法即可。

package com.demo.utils;import org.springframework.security.crypto.password.PasswordEncoder;public class TestPasswordEncoder implements PasswordEncoder {@Overridepublic String encode(CharSequence rawPassword) {return "";}@Overridepublic boolean matches(CharSequence rawPassword, String encodedPassword) {return false;}
}

顺便说明下,encode 方法是将参数加密成密文,matches 方法的第一个参数是未加密的参数,第二个参数是密文,不难理解方法的逻辑是将第一个参数在加密过后,与第二个参数进行比较,根据结果返回一个boolean。

当然,改完这个就完事了吗??No_No_No~

注意事项:
1 在修改密码的方法中,需要同步加密新密码,再入库保存;
2 新增用户时需要针对配置的默认密码也进行进行加密,,再入库保存;
3 如果有文件导入的方法创建用户,那么也需要针对密码进行加密;
4 建议对原来的加密类,再查询下是否有其他地方在引用,根据代码判断是否也需要修改;

后面是作者对整个过程的梳理,如果仅是修改加密算法,那么看到这里就可以了,如果能帮到大家,还需要大家的点赞收藏支持,这个真的很重要~~

二、解决过程

1 为啥要改加密算法

这个其实不难理解,因为甲方是一家 bank 公司,对加密有着严格要求,只是当我将这块都写完了才意识到一个问题,密文存储密码导致密码在数据库的字符串看起来就像是乱码一样,那他怎么知道我是否用了规定的加密算法呢?哈哈~开句玩笑,但是我确实不清楚甲方如何去验证这个。

2 找不到校验代码

这部分描述会附上代码,因为这块代码是若依框架自带的,所以不同的项目关于登录的代码几乎一样。

如前言所述,系统原来的校验逻辑是看不到的,只有一行代码

	// 该方法会去调用UserDetailsServiceImpl.loadUserByUsernameauthentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));

这行代码会校验密码,但是点进这个 authenticate 方法内部,发现这个方法本身是个接口,有多个实现

	Authentication authenticate(Authentication authentication) throws AuthenticationException;

而这个方法内部的 new UsernamePasswordAuthenticationToken(username, password) 对应的构造函数也看不出校验逻辑

	public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {super(null);this.principal = principal;this.credentials = credentials;setAuthenticated(false);}

然后我也看了注释中提到的方法,发现也没有关于密码校验的逻辑

  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {SysUser user = userService.selectUserByUserName(username);if (StringUtils.isNull(user)) {log.info("登录用户:{} 不存在.", username);throw new ServiceException("账号或密码错误");} else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {log.info("登录用户:{} 已被删除.", username);throw new ServiceException("账号或密码错误");} else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {log.info("登录用户:{} 已被停用.", username);throw new ServiceException("对不起,您的账号:" + username + " 已停用");}return createLoginUser(user);}public UserDetails createLoginUser(SysUser user) {return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));}

所以单从代码去追溯源码,比较困难;正向解决不了问题,只能问百度了,在看了十几篇文章后发现,在系统 SecurityConfig 文件中,有关于加密算法对象的 bean,然后就自然而然的想把这个算法替换成自己的加密算法,然后就ok了。

总结

没什么好总结的,这是框架将密码校验的部分封装了,所以必需要一层层看源码才能直接解决问题,作者这属于走捷径,不推荐哈

如果文章正真的帮到你,或者让你知道了新知识,还希望大家多多~~~~~~~~~~~~~~点赞收藏!!!

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

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

相关文章

Flutter富文本实现学习

Flutter 代码如何实现一个带有富文本显示和交互的页面。 前置知识点学习 RealRichText RealRichText 和 ImageSpan 不是 Flutter 框架中内置的组件,而是自定义的组件或来自第三方库。这些组件的实现可以提供比标准 RichText 更丰富的功能,比如在富文本…

MBox20边缘计算网关助力各种数字化升级

在当今全球范围内数字化浪潮的强劲推动下,企业对数据处理与传输能力的需求正以前所未有的速度增长。制造业的心脏地带——工厂,其数字化转型已成为驱动生产效率飞跃、成本控制优化及竞争力显著提升的关键路径。在此过程中,明达技术MBox20边缘…

el-table动态行和列及多级表头

主页面 <template><div class"result-wrapper"><dynamic-table :table-data"tableData" :table-header"tableConfig" :tableTitle"tableTitle" :flowParams"flowParams"></dynamic-table></div…

RocketMQ(二)RocketMQ实战

文章目录 一、RocketMQ实战1.1 批量消息发送1.2 消息发送队列自选择1.3 事务消息1.4 SpringCloud集成RocketMQ 二、最佳实践2.1 生产者2.1.1 发送消息注意事项2.1.2 消息发送失败处理方式 2.2 消费者2.2.1 消费过程幂等2.2.2 消费打印日志 2.3 Broker 三、相关问题3.1 为什么要…

2-194基于matlab的四足机器人行走程序设计

基于matlab的四足机器人行走程序设计&#xff0c;正运动设计&#xff0c;逆运动学解算&#xff0c;步态设计。可定义机身高、步长、步高、一个摆相的市场等参数。输出四足机器人动态行走结果&#xff0c;及摆相示意图。程序已调通&#xff0c;可直接运行。 2-194基于matlab的四…

android studio android sdk下载地址

android studio安装后&#xff0c;因为公司网络原因&#xff0c;一直无法安装android sdk 后经过手机网络&#xff0c;安装android sdk成功如下&#xff0c;也可以手动下载后指定android sdk本地目录 https://dl.google.com/android/repository/source-35_r01.zip https://dl…

字符串和对象之间的转换

使用&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version> </dependency> public class Demo3 {public static void main(String[] args) {Person person …

conda常用维护命令

文章目录 1. 初始化和更新 Conda更新 Conda初始化 Conda&#xff08;如果需要&#xff09; 2. 管理环境创建新环境激活环境停用当前环境列出所有环境删除环境 3. 管理包安装包卸载包更新包更新所有包查找包列出已安装包 4. 导入导出环境导出环境配置从文件创建环境 5. 管理通道…

window如何将powershell以管理员身份添加到右键菜单?(按住Shift键显示)

window如何将powershell以管理员身份添加到右键菜单&#xff1f; 在 Windows 中&#xff0c;将 PowerShell 以管理员身份添加到右键菜单&#xff0c;可以让你在需要提升权限的情况下快速打开 PowerShell 窗口。以下是详细的步骤&#xff0c;包括手动编辑注册表和使用注册表脚本…

【NebulaGraph】变化的多跳查询

【NebulaGraph】变化的多跳查询 1. 需求2. 解决方案2.1 确定查询结构2.2 构建查询语句 3. 追加需求&#xff1a;如果增加每一跳都要指定查询某SPACE下的Tag&#xff0c;或者不查询某个Tag怎么办 1. 需求 存在多跳请求&#xff0c;其中每一跳是从上一跳查询结果为基础的。但是 …

【Rust自学】7.3. 路径(Path)Pt.2:访问父级模块、pub关键字在结构体和枚举类型上的使用

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 7.3.1. super 我们可以通过在路径开头使用super来访问父级模块路径中的内容&#xff0c;就像使用..语法启动文件系统路径。例如&#xff…

华为ensp-BGP联盟

学习新思想&#xff0c;争做新青年&#xff0c;今天学习BGP联盟 实验介绍 一个BGP联盟是一个具有内部层次结构的AS。一个BGP联盟由若干个子AS 组成&#xff0c;子AS也称为成员AS。对于一个BGP联盟&#xff0c;其成员AS内部的各路由器之间需要建立全互联的IBGP邻居关系或使用B…

内部类(3)

大家好&#xff0c;今天我们继续来看看内部类&#xff0c;今天我们来学习一下内部类的分类&#xff0c;我们来看看一共有几种&#xff0c;它们有什么作用&#xff0c;那么话不多说&#xff0c;我们直接开始。 9.1 内部类的分类 先来看下,内部类都可以在一个类的哪些位置进行定…

解决ssh和git秘钥认证失败问题

已正确上传公钥到远程服务器&#xff0c;但是本地的连接认证还是使用默认秘钥文件名id_rsa或者默认用户名&#xff0c;导致了认证失败&#xff0c;总结了以下解决办法&#xff1a; 1、ssh秘钥认证 远程登录的时候可能ssh客户端默认使用id_rsa文件名秘钥&#xff0c;但是之前生…

FlastOcc-网络复现-1.环境配置及问题

研究OCC网络 1.RuntimeError: Ninja is required to load C extensions RuntimeError: Ninja is required to load C extensions #32 Ninja is required to load C extensions File “/FlashOCC/projects/mmdet3d_plugin/core/evaluation/ray_metrics.py”, line 12, in dvr …

【Python】ftp和sftp工具类,使用python实现文件的上传与下载

文章目录 1. ftp工具类2. sftp工具类 1. ftp工具类 编写ftp工具类&#xff0c;我这里取名为 ftp_util.py import os from ftplib import FTPclass FtpUtil:def __init__(self, ip, username, password, port21):self.ip ipself.username usernameself.password passwordse…

【VBA】EXCEL - VBA 遍历工作表的 5 种方法,以及注意事项

目录 1. 遍历单列数据并赋值 2. 遍历整个工作表的数据区域并赋值 3. 遍历指定范围的数据并赋值 4. 遍历多列数据并赋值 5. 遍历所有工作表中的数据并赋值 注意事项&#xff1a; 1. 遍历单列数据并赋值 Sub UpdateColumnData()Dim ws As WorksheetSet ws ThisWorkbook.S…

Airbnb/Booking 系统设计(high level architecture)

原文地址 CodeKarle: Airbnb System Design | Booking.com System Design B站搜 “Airbnb System Design” 有视频版本 需求&#xff1a; 功能性需求 系统用户包括商家和客人。 Hotel - 商家&#xff08;拥有hotel的人&#xff09; onboarding - 商家可以入住系统。 update…

【QT开发自制小工具】PDF/图片转excel---调用百度OCR API接口

前言 前几年WPS还可以免费处理5页以内的PDF转excel&#xff0c;现在必须付费了&#xff0c;而且其他在线的PDF转excel都是要收费的&#xff0c;刚好前几年调研过百度OCR的高精度含位置接口&#xff0c;依然是每天可以免费调用50次&#xff0c;本篇是基于此接口&#xff0c;开发…

云原生周刊:Docker 的替代方案

开源项目推荐 Dito Dito 是一个用 Go 语言编写的高级 Layer 7 反向代理服务器&#xff0c;提供灵活的中间件支持、后端连接的自定义证书处理、动态配置重载&#xff0c;以及与 Redis 的分布式缓存和速率限制功能。其主要特性包括高效处理 HTTP 和 HTTPS 请求、支持 WebSocket…