首页 > 编程语言 >若依(spring-cloud)修改登陆密码加密算法

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

时间:2024-12-30 14:27:31浏览次数:7  
标签:username 加密 spring 登陆密码 user new public 加密算法

文章目录


前言

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

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


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

一、解决办法

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

   /**
   * 强散列哈希加密实现
   */
  /*@Bean
  public BCryptPasswordEncoder bCryptPasswordEncoder() {
    return new BCryptPasswordEncoder();
  }*/

  /**
   * 自定义加密算法
   * 
   */
  @Bean
  public TestPasswordEncoder testPasswordEncoder() {
    return new TestPasswordEncoder();
  }
  /**
   * 身份认证接口
   */
  @Bean
  public DaoAuthenticationProvider authenticationProvider() {
    DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
    authProvider.setUserDetailsService(userDetailsService);
    authProvider.setPasswordEncoder(sm2PasswordEncoder());
    return authProvider;
  }

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

package com.demo.utils;

import org.springframework.security.crypto.password.PasswordEncoder;

public class TestPasswordEncoder implements PasswordEncoder {

  @Override
  public String encode(CharSequence rawPassword) {
    return "";
  }

  @Override
  public boolean matches(CharSequence rawPassword, String encodedPassword) {
    return false;
  }
}

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

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

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

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

二、解决过程

1 为啥要改加密算法

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

2 找不到校验代码

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

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

	// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
	authentication = 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了。

总结

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

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

标签:username,加密,spring,登陆密码,user,new,public,加密算法
From: https://blog.csdn.net/wangyang857/article/details/144049895

相关文章

  • 计算机毕业设计 | SpringBoot+vue商业辅助决策系统 企业销售收支员工OA管理(附源码+论
    1,绪论1.1课题背景二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿沟,信息的传播速度极慢,信息处理的速度和要求还是通过人们骑马或者是信鸽传递,这些信息传递都是不可控......
  • 计算机毕业设计 | SpringBoot+vue入校申报审批系统 大学高校教务管理(附源码+论文)
    1,绪论1.1研究背景现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化,也让时间变得更加地宝贵化,因为每天的每分钟,每秒钟这些时间都能让人们处理大批量的日常事务,这些场景......
  • 【开源免费】基于Vue和SpringBoot的共享汽车管理系统(附论文)
    本文项目编号T126,文末自助获取源码\color{red}{T126,文末自助获取源码}......
  • 【开源免费】基于Vue和SpringBoot的共享汽车管理系统(附论文)
    本文项目编号T125,文末自助获取源码\color{red}{T125,文末自助获取源码}......
  • SpringBoot中如何使用事务, 有哪些失效的情况
    详细:在方法上添加@Transactional注解来开启事务,有多个可配置选项用于控制事务的行为可指定的配置选项:rollbackFor属性指定事务回滚的规则DEFAULT:使用数据库的默认隔离级别。READ_UNCOMMITTED:允许读取未提交的数据。READ_COMMITTED:只能读取已提交的数据。REPEATABLE_......
  • springboot毕设 在线考试系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和教育信息化的不断推进,传统的考试模式正面临着前所未有的变革。在线考试系统作为一种新兴的教育技术应用形式,以其便捷性、......
  • springboot毕设 在线考试系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和普及,教育领域正经历着深刻的变革。传统考试模式受限于时间、地点和资源的限制,已难以满足现代教育对于灵活性、便捷性和高......
  • springboot毕设 在线考试平台设计与实现 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,教育领域也迎来了数字化、网络化的变革。传统的考试方式,如纸质试卷、人工监考等,已经难以满足现代教育的需求。在线考试平台......
  • Springboot怀旧唱片售卖系统 毕业设计程序源码09932
    目  录毕业设计概述第一章任务分析及思路(一)设计背景(二)研究目的(三)本平台主要使用的核心技术1.MySQL技术简介2.Tomcat技术简介3.Java技术简介4.Springboot技术简介(四)设计思路以及特点1.设计思路2.设计特点第二章设计实施(一)平台需求分析1.使......
  • springboot-data-jdbc优劣
    经过一段时间对springboot-data-jdbc的使用,总结了一下几点:优点:通过配置外键关联,在保存一个实体类的情况下,会自动保存对应的外键信息(比如上图实体类如果设置了legItems和orderDetails的值,则会保存对应的数据)通过配置外键关联,在查询一个实体类的情况下,会自动查询出外键关联的信......