当前位置: 首页 > news >正文

在Spring项目中使用Maven和BCrypt来实现修改密码功能

简介 

在数字时代,信息安全的重要性不言而喻,尤其当涉及到个人隐私和账户安全时。每天,无数的用户登录各种在线服务,从社交媒体到银行账户,再到电子邮件和云存储服务。这些服务的背后,是复杂的系统架构,其中包含着用户最为敏感的数据——密码。

过去,简单的加密方法和弱密码策略导致了许多严重的数据泄露事件。例如,2013年雅虎(Yahoo)遭遇的大规模数据泄露事件,影响了数十亿的用户账户,部分原因就是由于使用了不够安全的密码存储技术。再如2016年的LinkedIn数据泄露事件,尽管该公司使用了SHA-1散列算法对密码进行了处理,但未加盐的密码散列最终还是被破解,暴露了用户的隐私。

这些事件引发了行业对于密码安全的深刻反思,促使开发者和安全专家寻找更安全的解决方案。BCrypt作为一种适应性强且经过时间考验的密码哈希算法,成为了现代密码安全的基石。它不仅能够有效抵御暴力破解和彩虹表攻击,还能通过增加工作因子来适应未来计算能力的增长。

在本文中,我们将深入探讨如何在Spring项目中利用Maven和BCrypt来实现一个安全的密码修改功能。这不仅仅是关于代码实现的问题,更是一次对密码安全重要性的重申,以及对如何在实际应用中践行这一原则的示范。我们将从环境搭建开始,逐步构建出一个既实用又安全的密码修改流程,确保即使在最恶劣的情况下,用户的密码也能得到妥善保护。

通过本文的学习,你将获得宝贵的实践经验,了解如何在自己的项目中实施类似的解决方案,从而提升应用的安全性,给用户提供更加安心的在线体验。在接下来的内容中,我们将一步步解析实现过程,从添加依赖到编写核心业务逻辑,直至完成完整的功能测试,确保每一步都遵循最佳的安全实践。

controller(UserController)

/*** 修改密码*/@PutMapping("/update/pwd/{id}")public Result update(@PathVariable("id") long id, @RequestBody ChangePasswordVo changePasswordVo) {try{userService.changePassword(changePasswordVo,id);return Result.success("修改成功!");}catch (Exception e){// 捕获异常,获取异常信息String message = e.getMessage();// 如果修改失败,返回失败的结果,并附带异常信息return Result.failed(message);}}

  1. 注解 @PutMapping("/update/pwd/{id}")

    • @PutMapping 是Spring MVC中的一个注解,用于处理HTTP PUT请求。
    • "/update/pwd/{id}" 是该方法的URL路径。其中 {id} 是一个路径变量,用于接收用户ID。
  2. 方法定义 public Result update(...)

    • 这是一个公开的方法,名为update,返回一个Result对象。
    • Result 很可能是一个自定义的响应类,通常用于封装API的响应结果,包括状态码、消息和数据等。
  3. 方法参数

    • @PathVariable("id") long id:这是从URL路径中提取的id变量。@PathVariable 注解告诉Spring MVC从URL中提取名为id的变量值,并将其转换为long类型。
    • @RequestBody ChangePasswordVo changePasswordVo@RequestBody 注解用于将HTTP请求体中的JSON数据转换为ChangePasswordVo类型的对象。ChangePasswordVo 可能是一个包含旧密码和新密码等信息的DTO(数据传输对象)。
  4. 方法体

    • 首先,它尝试调用 userService.changePassword(changePasswordVo,id);。这里假设userService是一个已经注入的服务类,用于处理与用户相关的业务逻辑。changePassword 方法可能会根据提供的用户ID和密码信息来更新用户的密码。
    • 如果上述操作成功,方法将返回一个表示成功的Result对象,并附带消息“修改成功!”。
    • 如果在更新密码的过程中发生异常(如数据库错误、密码验证失败等),catch 块将捕获该异常,并获取其消息。然后,它返回一个表示失败的Result对象,并附带异常的消息。


entity(VO-ChangePasswordVo)

@Data
public class ChangePasswordVo implements Serializable {/*** 旧的密码*/private String oldpassword;/*** 新的密码*/private String newpassword;}
  1. 注解

    • @Data: 这是一个Lombok库提供的注解。当你添加@Data到类上时,Lombok会自动为这个类生成getter、setter、equals、hashCode和toString方法。这可以大大减少模板代码的数量,使代码更加简洁。
    • implements Serializable: 这表示该类实现了Serializable接口。Serializable是一个标记接口,用于指示一个类的对象可以被序列化。序列化是将对象状态转换为字节流,以便可以将其写入文件或发送到网络上的另一个位置。如果该类或其成员类(如果它们不是基本类型或String数组等)需要被序列化,则必须实现这个接口。
  2. 成员变量

    • private String oldpassword;: 这是一个私有字符串类型的成员变量,用于存储旧的密码。但是,从Java的命名约定来看,变量名应该使用驼峰命名法(camelCase),并且首字母小写。因此,更合适的命名可能是oldPassword
    • private String newpassword;: 同样,这是一个私有字符串类型的成员变量,用于存储新的密码。按照Java的命名约定,它应该被命名为newPassword
  3. 注释

    • 每个成员变量上方都有注释,描述了该变量的用途。这是一个很好的做法,因为它增加了代码的可读性。但是,请注意,这些注释是用中文写的,而在国际项目中,通常建议使用英文注释。

Service


UserService

void changePassword(ChangePasswordVo changePasswordVo, Long id);
  1. 返回类型 (void): 方法前面有一个void关键字,表示这个方法没有返回值。也就是说,当你调用这个方法时,它不会返回任何值或对象。

  2. 方法名 (changePassword): 这是方法的名称,即changePassword。当你想在代码的其他部分调用这个方法时,你会使用这个名字。

  3. 参数:

    • ChangePasswordVo changePasswordVo: 这是方法的第一个参数。

      • ChangePasswordVo: 这是参数的类型。它可能是一个数据传输对象(DTO),用于封装与更改密码相关的数据,如旧密码、新密码等。
      • changePasswordVo: 这是参数的名称。在方法内部,你可以使用这个名称来引用传入的ChangePasswordVo对象。
    • Long id: 这是方法的第二个参数。

      • Long: 这是参数的类型,表示这是一个长整型(64位整数)数据。
      • id: 这是参数的名称。在方法内部,你可以使用这个名称来引用传入的id值。从参数名可以推测,这个id可能表示用户的唯一标识符(如用户ID)。

UserServiceImpl

 @Overridepublic void changePassword(ChangePasswordVo changePasswordVo, Long id){// 根据id查询用户信息User user = userMapper.selectById(id);// 判断原密码是否正确if(!BCrypt.checkpw(changePasswordVo.getOldpassword(),user.getPassword())){throw new RuntimeException("原密码不正确");}// 设置新密码user.setPassword(BCrypt.hashpw(changePasswordVo.getNewpassword(), BCrypt.gensalt()));// 调用Mapper的updateById方法更新用户信息userMapper.updateById(user);}
  1. @Override: 这是一个Java注解,它告诉编译器这个方法是从超类或接口中继承或实现的。使用@Override注解可以确保你正确地重写了父类或接口中的方法,如果没有正确重写(例如方法签名不匹配),编译器会报错。

  2. public void changePassword(ChangePasswordVo changePasswordVo, Long id): 这是方法的声明部分。

    • public:表示这是一个公共方法,可以从任何其他类中被访问。
    • void:表示该方法没有返回值。
    • changePassword:是方法的名称。
    • ChangePasswordVo changePasswordVo 和 Long id:是方法的参数。ChangePasswordVo可能是一个数据传输对象(DTO),用于封装密码更改请求所需的信息(如旧密码和新密码)。id则是用户的唯一标识符。
  3. User user = userMapper.selectById(id);

    • 使用userMapper(可能是MyBatis的Mapper或类似的ORM工具)的selectById方法根据提供的id从数据库中查询用户信息,并将查询到的用户信息存储在user变量中。
  4. if(!BCrypt.checkpw(changePasswordVo.getOldpassword(),user.getPassword())){

    • 使用BCrypt库(一个流行的密码哈希库)的checkpw方法检查用户提供的旧密码(从changePasswordVo中获取)是否与数据库中存储的哈希密码(从查询到的user对象中获取)匹配。
    • 如果不匹配(!BCrypt.checkpw(...)返回true),则执行下面的throw语句。
  5. throw new RuntimeException("原密码不正确");

    • 如果旧密码不正确,则抛出一个RuntimeException,并带有消息“原密码不正确”。调用此方法的代码应该捕获此异常并适当地处理它(例如,向用户显示错误消息)。
  6. user.setPassword(BCrypt.hashpw(changePasswordVo.getNewpassword(), BCrypt.gensalt()));

    • 如果旧密码正确,则使用BCrypt库的gensalt方法生成一个新的随机盐值。
    • 使用这个新盐值和用户提供的新密码(从changePasswordVo中获取)作为参数,调用BCrypthashpw方法生成新的哈希密码。
    • 将这个新的哈希密码设置到user对象的password字段中。
  7. userMapper.updateById(user);

    • 使用userMapperupdateById方法更新数据库中对应id的用户的密码信息。这里假设userMapperupdateById方法会处理将user对象中的更改保存到数据库中的逻辑。

 


测试

先新增一条数据

密码:111

进行修改密码;

id为你新增后的id号

输入字段为我之前定义的字段oldpassword与newpassword

可以看到密码已经被修改

相关文章:

在Spring项目中使用Maven和BCrypt来实现修改密码功能

简介 在数字时代,信息安全的重要性不言而喻,尤其当涉及到个人隐私和账户安全时。每天,无数的用户登录各种在线服务,从社交媒体到银行账户,再到电子邮件和云存储服务。这些服务的背后,是复杂的系统架构&am…...

RedHat8安装Oracle19C

RedHat8安装Oracle19C 1、 更新yum源 更新yum源为阿里云镜像源: # 进入源目录 cd /etc/yum.repos.d/ # 删除 redhat 默认源 rm redhat.repo # 下载阿里云的centos7源 curl -O http://mirrors.aliyun.com/repo/Centos-8.repo # 替换 Centos-8.repo 中的 $releasev…...

React系列面试题

大家好,我是有用就点赞,有用就扩散。 1.React的组件间通信都有哪些形式? 父传子:在React中,父组件调用子组件时可以将要传递给子组件的数据添加在子组件的属性中,在子组件中通过props属性进行接收。这个就…...

C#:通用方法总结—第6集

大家好&#xff0c;今天继续介绍我们的通用方法系列。 下面是今天要介绍的通用方法&#xff1a; &#xff08;1&#xff09;这个通用方法为SW查找草图数量 /// <summary> /// 查找草图数量 /// </summary> /// <param name"doc2"></param>…...

Spark实时(一):StructuredStreaming 介绍

文章目录 Structured Streaming 介绍 一、SparkStreaming实时数据处理痛点 1、复杂的编程模式 2、SparkStreaming处理实时数据只支持Processing Time 3、微批处理,延迟高 4、精准消费一次问题 二、StructuredStreaming架构与场景应用 三、​​​​​​​​​​​​​​…...

LangChain4j-RAG基础

RAG是什么 简而言之&#xff0c;RAG 是一种在将数据发送到 LLM 之前从数据中查找相关信息并将其注入到提示中的方法。这样LLM将获得&#xff08;希望&#xff09;相关信息&#xff0c;并能够使用这些信息进行回复&#xff0c;这应该会减少产生幻觉的可能性。 实现方法: 全文…...

git--本地仓库修改同步到远程仓库

尝试将本地分支推送到远程仓库时&#xff0c;出现一个非快速前进的错误。通常是因为远程仓库中的分支包含本地分支没有的提交。在推送之前&#xff0c;需要将远程仓库的更改合并到本地分支。 解决步骤如下&#xff1a; 切换到你的本地分支&#xff1a; 确保处于想要推送的分支…...

剑和沙盒 3 - 深度使用和解析Windows Sandbox

介绍 两年前&#xff0c;微软作为Insiders build 18305的一部分发布了一项新功能- Windows Sandbox。 该沙箱具有一些有用的规格&#xff1a; Windows 10&#xff08;Pro/Enterprise&#xff09;的集成部分。在 Hyper-V 虚拟化上运行。原始且可抛弃 – 每次运行时都干净地开…...

深度学习loss

pytorch模型训练demo代码 在PyTorch中&#xff0c;模型训练通常涉及几个关键步骤&#xff1a;定义模型、定义损失函数、选择优化器、准备数据加载器、编写训练循环。以下是一个简单的PyTorch模型训练演示代码&#xff0c;该代码实现了一个用于手写数字识别&#xff08;使用MNIS…...

编写一个Chrome插件,网页选择文字后,右键出现菜单“search with bing”,选择菜单后用bing搜索文字

kimi ai 生成&#xff0c;测试可用&#xff0c;需要自行准备图标文件 创建一个简单的Chrome插件来实现选择文本后的搜索功能&#xff0c;你需要完成以下几个步骤&#xff1a; 创建插件的基础文件夹和文件&#xff1a; 创建一个文件夹用于存放插件的所有文件。在该文件夹中创建以…...

【算法】分割回文串

难度:中等 题目: 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。 示例 1: 输入:s = “aab” 输出:[[“a”,“a”,“b”],[“aa”,“b”]] 示例 2: 输入:s = “a” 输出:[[“a”]] 提示: 1 <= s.length <…...

lua 游戏架构 之 游戏 AI (三)ai_attack

这段Lua脚本定义了一个名为 ai_attack 的类&#xff0c;继承自 ai_base 类。 lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客文章浏览阅读119次。定义了一套接口和属性&#xff0c;可以基于这个基础类派生出具有特定行为的AI组件。例如&#xff0c;可以…...

大数据之Oracle同步Doris数据不一致问题

数据同步架构如下&#xff1a; 出现的问题&#xff1a; doris中的数据条数 源库中的数据条数 总数完全不一致。 出现问题的原因&#xff1a; 在Dinky中建立表结构时&#xff0c;缺少对主键属性的限制 primary key(ID) not enforced 加上如上语句&#xff0c;数据条数解决一致 …...

visual studio 问题总结

一. Visual Studio: 使用简体中文&#xff08;GB2312&#xff09;编码加载文件, 有些字节已用Unicode替换字符更换 解决方法&#xff1a;vs 工具-》选项-》文本编辑器...

go-错误码的最佳实践

一、背景 在工程开发中&#xff0c;我们有以下场景可以用错误码解决 我们不太方便直接将内部的错误原因暴露给外部&#xff0c;可以根据错误码得到对应的外部暴露消息通过设定错误码判断是客户端或者服务端的问题&#xff0c;避免不必要的排障浪费方便查找日志&#xff0c;定…...

Python面试题:使用Matplotlib和Seaborn进行数据可视化

使用Matplotlib和Seaborn进行数据可视化是数据分析中非常重要的一部分。以下示例展示了如何使用这两个库来创建各种图表&#xff0c;包括基本的线图、柱状图、散点图和高级的分类数据可视化图表。 安装 Matplotlib 和 Seaborn 如果你还没有安装这两个库&#xff0c;可以使用以…...

模拟实现c++中的vector模版

目录 一vector简述&#xff1a; 二vector的一些接口函数&#xff1a; 1初始化&#xff1a; 2.vector增长&#xff1a; 3vector增删查改&#xff1a; 三vector模拟实现部分主要函数&#xff1a; 1.size,capacity,empty,clear接口&#xff1a; 2.reverse的实现&#xff1…...

uniapp安卓通过绝对路径获取文件

uniapp安卓通过绝对路径获取文件 在uniapp中&#xff0c;如果你想要访问安卓设备上的文件&#xff0c;你需要使用uniapp提供的plus.io API。这个API允许你在应用内访问设备的文件系统。 以下是一个示例代码&#xff0c;展示了如何使用plus.io API来获取文件&#xff1a; fun…...

Known框架实战演练——进销存业务单据

本文介绍如何实现进销存管理系统的业务单据模块&#xff0c;业务单据模块包括采购进货单、采购退货单、销售出货单、销售退货单4个菜单页面。由于进销单据字段大同小异&#xff0c;因此设计共用一个页面组件类。 项目代码&#xff1a;JxcLite开源地址&#xff1a; https://git…...

解决npm依赖树冲突的方法以及npm ERR! code ERESOLVE错误的解决方案

一、问题描述 在使用ng new myapp --skip-install 构建Angular 项目后&#xff0c;尝试用npm install 安装依赖的时候报了以下错误。 (base) PS C:\Users\Administrator\Desktop\agtest\myapp> npm i npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependenc…...

铁路光纤熔接机推荐:鼎讯 TY-30H 性能参数与应用场景

在铁路与高速公路通信建设中&#xff0c;光纤熔接质量直接决定信号传输稳定性。鼎讯 TY-30H 光纤熔接机作为专为野外严苛工况设计的熔接设备&#xff0c;凭借高效、低耗、耐用的综合性能&#xff0c;成为铁路高速通信施工、日常维护及应急抢修的核心设备。一、鼎讯 TY-30H 光纤…...

终极 ChatGPT-Google 扩展日志分析指南:深度洞察用户行为与功能使用统计 [特殊字符]

终极 ChatGPT-Google 扩展日志分析指南&#xff1a;深度洞察用户行为与功能使用统计 &#x1f50d; 【免费下载链接】chatgpt-google-extension This project is deprecated. Check my new project ChatHub: 项目地址: https://gitcode.com/gh_mirrors/ch/chatgpt-google-ext…...

AI应用开发利器:Prompster提示词管理库的设计与实践

1. 项目概述&#xff1a;一个为AI应用开发者准备的提示词管理利器如果你正在开发基于大语言模型&#xff08;LLM&#xff09;的应用&#xff0c;无论是聊天机器人、内容生成工具&#xff0c;还是复杂的AI工作流&#xff0c;那么你一定对“提示词工程”这个词深有体会。从最初的…...

儿童房 书房健康照明设计:国标 RG0/UGR<19/Ra≥90 武汉家装实用指南

摘要家里装儿童房、书房&#xff0c;灯光真不是随便装个灯就行。尤其武汉本地家庭&#xff0c;孩子长期在家写作业、看书&#xff0c;灯光选不对&#xff0c;很容易眼疲劳、揉眼睛、注意力不集中。本文结合实际家装经验&#xff0c;照着国标要求&#xff0c;用大白话讲清无蓝光…...

Vibe Coding:从环境配置到心流状态,打造高效编程工作流

1. 项目概述&#xff1a;从“氛围感”到“心流”的编程实践指南最近在开发者社区里&#xff0c;一个名为“Vibe Coding Playbook”的项目引起了我的注意。这个项目由 isumitsoni 发起&#xff0c;它不像传统的技术教程那样&#xff0c;一上来就教你如何配置环境、写什么代码&am…...

KokonutUI:基于React的现代化UI组件库设计与实践

1. 项目概述&#xff1a;一个为现代Web应用而生的UI组件库如果你最近在寻找一个既现代又实用的React UI组件库&#xff0c;那么kokonutui这个名字可能已经出现在你的视野里了。它不是一个横空出世、试图颠覆一切的庞然大物&#xff0c;而更像是一个由一线开发者精心打磨的工具箱…...

Agent 工具调用决策链的治理框架:从意图识别到执行回滚的长期演进策略

问题现象 生产环境中&#xff0c;智能体系统在面对用户请求时频繁出现“该调工具却直接回复”或“不该调工具却强行调用”的误判行为。典型表现为&#xff1a;用户询问“帮我查一下昨天的订单”&#xff0c;系统返回一段通用话术而非调用订单查询接口&#xff1b;而当用户明确说…...

【NotebookLM视觉增强实战指南】:20年CV专家亲授5大落地场景与避坑清单

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM计算机视觉辅助概述 NotebookLM 是 Google 推出的基于 LLM 的笔记增强工具&#xff0c;原生聚焦于文本理解与推理。当其与计算机视觉&#xff08;CV&#xff09;能力结合时&#xff0c;可通过…...

Insights Imaging(IF=4.5)郑州大学第一附属医院高剑波等团队:基于CT的影像组学预测不可切除胃癌PD-1/PD-L1抑制剂联合化疗治疗反应

01文献学习今天分享的文献是由郑州大学第一附属医院高剑波教授等团队于2026年3月12日在《Insights into Imaging》&#xff08;中科院2区&#xff0c;IF4.5&#xff09;上发表的研究“CT-based radiomics for predicting the treatment response to PD-1/PD-L1 inhibitors comb…...

如何3分钟快速检测代码抄袭:JPlag完整使用指南

如何3分钟快速检测代码抄袭&#xff1a;JPlag完整使用指南 【免费下载链接】JPlag State-of-the-Art Source Code Plagiarism & Collusion Detection. Check for plagiarism in a set of programs. 项目地址: https://gitcode.com/gh_mirrors/jp/JPlag 在编程教学和…...