使用Spring Security 5进行密码编码器迁移

最近,我在一个使用自定义PasswordEncoder的项目中工作,需要将其迁移到bcrypt 。 当前的密码存储为hash ,这意味着不可能将其还原为原始的String –至少不是简单的方法。

这里的挑战是如何支持两种实现,旧的哈希解决方案以及新的bcrypt实现。 经过一些研究,我可以找到Spring Security 5的 DelegatingPasswordEncoder

认识DelegatingPasswordEncoder

DelegatingPasswordEncoder类可以支持基于前缀的多个password encoders 。 密码存储如下:

{bcrypt}$2a$10$vCXMWCn7fDZWOcLnIEhmK.74dvK1Eh8ae2WrWlhr2ETPLoxQctN4.
{noop}plaintextpassword

Spring Security 5带来了方便的PasswordEncoderFactories类,当前该类支持以下编码器:

public static PasswordEncoder createDelegatingPasswordEncoder() {String encodingId = "bcrypt";Map<String, PasswordEncoder> encoders = new HashMap<>();encoders.put(encodingId, new BCryptPasswordEncoder());encoders.put("ldap", new org.springframework.security.crypto.password.LdapShaPasswordEncoder());encoders.put("MD4", new org.springframework.security.crypto.password.Md4PasswordEncoder());encoders.put("MD5", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("MD5"));encoders.put("noop", org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance());encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());encoders.put("scrypt", new SCryptPasswordEncoder());encoders.put("SHA-1", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-1"));encoders.put("SHA-256", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-256"));encoders.put("sha256", new org.springframework.security.crypto.password.StandardPasswordEncoder());return new DelegatingPasswordEncoder(encodingId, encoders);
}

现在,无需声明单个PasswordEncoder我们可以使用PasswordEncoderFactories ,例如以下代码片段:

@Bean
public PasswordEncoder passwordEncoder() {return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}

添加自定义编码器

现在,回到我最初的问题,由于遗留原因,有一个本地的password encoding解决方案,并且方便使用的PasswordEncoderFactories对它一无所知,以解决我已经创建了一个类似于PasswordEncoderFactories的类并添加了所有已构建的类的问题。 -in编码器和我的自定义编码器,这是一个示例实现:

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.DelegatingPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder;
import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder;import java.util.HashMap;
import java.util.Map;class DefaultPasswordEncoderFactories {@SuppressWarnings("deprecation")static PasswordEncoder createDelegatingPasswordEncoder() {String encodingId = "bcrypt";Map<String, PasswordEncoder> encoders = new HashMap<>();encoders.put(encodingId, new BCryptPasswordEncoder());encoders.put("ldap", new org.springframework.security.crypto.password.LdapShaPasswordEncoder());encoders.put("MD4", new org.springframework.security.crypto.password.Md4PasswordEncoder());encoders.put("MD5", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("MD5"));encoders.put("noop", org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance());encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());encoders.put("scrypt", new SCryptPasswordEncoder());encoders.put("SHA-1", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-1"));encoders.put("SHA-256", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-256"));encoders.put("sha256", new org.springframework.security.crypto.password.StandardPasswordEncoder());encoders.put("custom", new CustomPasswordEncoder());return new DelegatingPasswordEncoder(encodingId, encoders);}
}

然后,我使用DefaultPasswordEncoderFactories声明了@Bean

第一次运行后,我意识到另一个问题,我将必须运行一个SQL脚本来更新所有现有的密码,并添加{custom}前缀,以便框架可以正确地将前缀与正确的PasswordEncoder绑定,不要误解我的意思。很好的解决方案,但是我真的不想弄乱数据库中的现有密码,幸运的是, DelegatingPasswordEncoder类允许我们设置默认的 PasswordEncoder ,这意味着只要框架尝试在存储的密码中找不到前缀,它都会退回default以尝试对其进行解码。

然后,我将实现更改为以下内容:

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.DelegatingPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder;
import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder;import java.util.HashMap;
import java.util.Map;class DefaultPasswordEncoderFactories {@SuppressWarnings("deprecation")static PasswordEncoder createDelegatingPasswordEncoder() {String encodingId = "bcrypt";Map<String, PasswordEncoder> encoders = new HashMap<>();encoders.put(encodingId, new BCryptPasswordEncoder());encoders.put("ldap", new org.springframework.security.crypto.password.LdapShaPasswordEncoder());encoders.put("MD4", new org.springframework.security.crypto.password.Md4PasswordEncoder());encoders.put("MD5", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("MD5"));encoders.put("noop", org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance());encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());encoders.put("scrypt", new SCryptPasswordEncoder());encoders.put("SHA-1", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-1"));encoders.put("SHA-256", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-256"));DelegatingPasswordEncoder delegatingPasswordEncoder = new DelegatingPasswordEncoder(encodingId, encoders);delegatingPasswordEncoder.setDefaultPasswordEncoderForMatches(new CustomPasswordEncoder());return delegatingPasswordEncoder;}}

@Bean声明现在是:

@Bean
public PasswordEncoder passwordEncoder() {return DefaultPasswordEncoderFactories.createDelegatingPasswordEncoder();
}

结论

迁移密码编码器是一个现实生活中的问题, Spring Security 5通过一次支持多个PasswordEncoder提供了一种便捷的方式来轻松处理它。

脚注

  • 本教程使用的代码可以在GitHub上找到 。
  • DelegatingPasswordEncoder – Spring Docs

翻译自: https://www.javacodegeeks.com/2019/03/password-encoder-migration-spring-security-5.html

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

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

相关文章

[渝粤教育] 上海师范大学 家庭教育SPOC二班 参考 资料

教育 -家庭教育SPOC二班-章节资料考试资料-上海师范大学【】 请您阅读一本或几本家庭教育的相关书籍&#xff08;可参考推荐书目&#xff09;&#xff0c;并完成一篇不少于800字的读后感。推荐书目如下&#xff1a;《父母的语言》、《亲密关系》、《正面管教》、《母爱的羁绊》…

zigbee技术数传电台在石油探井状态监测系统

石油探井分布分散&#xff0c;数量众多&#xff0c;出现异常现象需及时处理。人工巡视耗时长、时效性差&#xff1b;有线传输存在布线繁琐、成本高、现场无移动网络覆盖等诸多缺点。 现需要一种支持大量接入、覆盖范围广、数据传输高效且有数据中心可以汇总数据的无线传输技术…

工业POE供电交换机在安防应用中的优势有哪些?

POE技术能在确保现有结构化布线安全的同时保证现有网络的正常运作&#xff0c;最大限度地降低成本。那么&#xff0c;工业POE供电在安防应用中具体有哪些优势呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来看看吧&#xff01; 简单的说&#xff0c;POE供电交换机具有以下…

[渝粤教育] 中南大学 科学计算与MATLAB语言 参考 资料

教育 -科学计算与MATLAB语言-章节资料考试资料-中南大学【】 随堂测验 1、【单选题】MATLAB一词来自&#xff08; &#xff09;的缩写。 A、Mathematica Laboratory B、Matrix Laboratory C、MathWorks Lab D、Matrices Lab 参考资料【 】 2、【单选题】下列选项中能反应MATLAB…

基于数传电台的组态王控制实现远程采集控制器PLC

「物联网应用案例」基于数传电台的组态王控制 一&#xff0e;案例介绍 采用亚控科技组态王结合亿佰特E90系列数传电台实现远程采集控制PLC。在这里主要介绍通信环境的搭建&#xff0c;故不采用过于复杂的控制程序&#xff0c;但为了体现控制效果&#xff0c;使用我们最熟悉的点…

工业级PoE交换机的分类知识详解

工业级PoE交换机具有电信级性能特征&#xff0c;可耐受严苛的工作环境&#xff0c;其产品系列丰富&#xff0c;端口配置灵活&#xff0c;可满足各种工业领域的使用需求。按多种方式对工业级PoE交换机进行分类。若参照开放系统互连参考模型OSI&#xff0c;则工业级PoE交换机属于…

[渝粤教育] 中原工学院 互换性与测量技术基础 参考 资料

教育 -互换性与测量技术基础-章节资料考试资料-中原工学院【】 第1单元测试题 1、【单选题】下面哪一个关于零部件具有互换性的概念是正确的&#xff08;&#xff09;。 A、在相同规格的一批零件或部件中&#xff0c;任取一件&#xff0c;不经任何挑选但经过适当修配&#xff0…

物联网无线数传通信常见的几种Modbus网关

以下提到Modbus网关均指Modbus RTU转Modbus TCP&#xff0c;并不涉及对Modbus ASCII数据帧的处理&#xff0c;Modbus ASCII仅支持透明传输。 1.简单协议转换 最常规也是最普遍的Modbus网关功能&#xff0c;简单协议转换是数据处理效率最高Modbus网关模式&#xff0c;它只是提…

物联网无线数传中Modbus通信网关协议到底是什么?

什么是物联网 通信Modbus网关 Modbus协议无线通信网关就是将一种Modbus协议帧转换为其他物联网无线数传协议帧。 比如将Modbus RTU的数据与Modbus TCP数据进行相互转换&#xff1b;也可将主机请求与从机响应进行应用开发以提升协议转换的效率&#xff1b;比如处理多主机请求的…

使用Caffeine和Spring Boot的多个缓存配置

缓存是几乎每个应用程序性能的关键。 有时需要分布式缓存 &#xff0c;但并非总是如此。 在许多情况下&#xff0c;本地缓存可以很好地工作&#xff0c;并且不需要分布式缓存的开销和复杂性。 因此&#xff0c;在许多应用程序中&#xff0c;包括普通的Spring和Spring Boot&…

[渝粤教育] 中原科技学院 设计学和美好生活 参考 资料

教育 -设计学和美好生活-章节资料考试资料-中原科技学院【】 单元测验 1、【单选题】请问最能代表汉族传统的服饰是哪一件&#xff1f; A、DVF裹身裙 B、深衣 C、长信宫灯 D、蜚襳垂髾 参考资料【 】 2、【多选题】古代中国的服饰有哪几层意义&#xff1f; A、保暖 B、审美 C、…

工业级POE交换机技术优势及供电方法详解!

众所周知&#xff0c;不论是任何设备都是需要供电才能运行的&#xff0c;监控摄像头也不例外&#xff0c;传统的视频监控&#xff0c;又或者说传统的供电方式&#xff0c;是需要拉电力线、挖管道&#xff0c;再通过插座接到摄像头上&#xff0c;摄像头才能正常工作。以前的时候…

物联网lora模块应用案例和LoRawan网关通信技术

什么是LoRa LoRa无线通信技术是 Semtech 在2012年开发出来的一款适合物联网使用的射频IC、其设计理念为低功耗、长距离、低成本、网路简单、易于扩展的无线数传技术。 在一般的通信中、通信的距离与功耗成正比、传输距离越远、功耗越高&#xff0c;而LoRa无线通信模块可以实现…

[渝粤教育] 中国传媒大学 政治传播学 参考 资料

教育 -政治传播学-章节资料考试资料-中国传媒大学【】 单元测验 1、【单选题】以下哪个选项是从国家维度认识政治&#xff1f; A、为了保护私有财产和个人自由&#xff0c;人们订立社会契约论&#xff0c;建立了国家 B、社会历史的决定性基础的经济关系决定着统治和从属的关系&…

LoRa模块在物联网中的应用

lora一种LPWAN通信技术&#xff0c;它基于扩频技术而广泛应用于超长距离的无线传输场景中。现在&#xff0c;LoRa主要在全世界433、868、915MHz等自由频带工作。其最大特征是灵敏度高&#xff0c;传输距离长&#xff0c;工作功耗低&#xff0c;网络节点多。 NB-IoT正在积极发展…

飞畅科技-工业级POE交换机解决方案专家

现如今&#xff0c;伴随着智能城市发展的大趋势&#xff0c;IP监控应用的需求也是迅速增长。政府和业主都需要实时监控关键基础设施的状态&#xff0c;工业级POE交换机可以说是成了当下网络监控项目的不二选择。接下来我们就一起来看看工业级POE交换机运用到户外IP监控系统时需…

[渝粤教育] 中国地质大学(武汉) 文化遗产与自然遗产 参考 资料

教育 -文化遗产与自然遗产-章节资料考试资料-中国地质大学&#xff08;武汉&#xff09;【】 随堂测验 1、【单选题】哪位法老建造的阿布辛拜勒神庙 A、塞提一世 B、阿肯纳顿 C、拉美西斯二世 D、图坦卡蒙 参考资料【 】 2、【单选题】因为以下哪项水利工程要搬迁阿布辛拜勒神庙…

ZigBee模块无线传输星形拓扑组网结构简介

zigbee模块无线传输协议的星形拓补是其三种拓补中最简单的拓补结构&#xff0c;包括一个Co-ordinator(zigbee中央协调器)网络节点和多个enddevice(zigbee模块终端)网络节点。每个endevice(zigbee模块终端)网络节点只能与co-ordinator(zigbee模块协调器)网络节点链接通信&#x…

[渝粤教育] 中国海洋大学 求职OMG 参考 资料

教育 -求职OMG-大学生就业指导与技能开发-章节资料考试资料-中国海洋大学【】 第一章测试题 1、【单选题】何时开始准备求职是最好的 A、毕业前三个月 B、毕业后三个月 C、 大三下学期 D、大一下学期 参考资料【 】 2、【单选题】求职的第一步是什么 A、网上投递求职简历 B、电…

jooq 分页排序_将jOOQ与Spring结合使用:排序和分页

jooq 分页排序JOOQ是一个库&#xff0c;可以帮助我们控制SQL。 它可以从我们的数据库生成代码&#xff0c;并允许我们使用其流畅的API来构建类型安全的数据库查询。 本教程前面的部分向我们介绍了如何配置应用程序的应用程序上下文&#xff0c;如何从数据库生成代码以及将CRUD…