Springboot +spring security,PasswordEncoder详解与应用

news2024/12/25 9:15:49

一.简介

在前面的文章有提到过PasswordEncoder: 为什么密码使用{noop}开头呢?也做出了相应的解释,这篇文章了解PasswordEncoder。

二.PassworderEncoder 详解

2.1主要方法

  1. String encode(CharSequence rawPassword):密码加密
  2. boolean matches(CharSequence rawPassword, String encodedPassword):密码匹配
  3. boolean upgradeEncoding(String encodedPassword): 升级密码,使用新规则来更新旧密码规则

2.2主要实现

  1. DelegatingPasswordEncoder 加密代理 默认的PassworderEncoder实例
  2. BCryptPasswordEncoder DelegatingPasswordEncoder 中默认的加密方式
  3. NoOpPasswordEncoder 不加密
  4. LazyPasswordEncoder 需要用的时候才初始化
  5. MessageDigestPasswordEncoder
  6. Md4PasswordEncoder

2.3默认PasswordEncoder

默认PasswordEncoder的代码如下:

 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());
  encoders.put("argon2", new Argon2PasswordEncoder());
  return new DelegatingPasswordEncoder(encodingId, encoders);
 }

2.4识别密码类型核心逻辑

识别密码类型核心逻辑的代码如下:

 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());
  encoders.put("argon2", new Argon2PasswordEncoder());
  return new DelegatingPasswordEncoder(encodingId, encoders);
 }

主要逻辑:

  1. 如果密码为空,则返回true

  2. 解析密码ID->{xxxx}

  3. 根据ID从map中获取PassworderEncoder

  4. 如果获取不到PassworderEncoder: {xxxx}为空或者不是合法的值,则跑出异常

  5. 如果获取到,则使用对应的PasswordEncoder进行密码匹配
    在这里插入图片描述
    从这段源码中,我们就知道默认的provider提供的密码处理器逻辑:

  6. 如果IOC容器中有且仅有一个PasswordEncoder,那么就使用IOC中的PassworderEncoder

  7. 如果没有,则使用DaoAuthenticationProvider 自己提供的,看构造方法逻辑:

在这里插入图片描述

三.Passworder实战

3.1验证默认的PassworderEncoder实例

分别使用BCryptPasswordEncoder、Argon2PasswordEncoder加密密码,代码如下:

public static void main(String[] args) {
        System.out.println("{pbkdf2}"+new Pbkdf2PasswordEncoder().encode("123456"));
        System.out.println("{bcrypt}"+new BCryptPasswordEncoder().encode("123456"));
    }

在这里插入图片描述

3.2基于内存模式添加用户

代码如下:

@Bean
    public UserDetailsService userDetailsService(){
        UserDetails noop = User.withUsername("noop").password("{noop}123456").roles("admin").build();
        UserDetails bcypt = User.withUsername("bcrypt").password("{bcrypt}$2a$10$MI6ueeZD8uhAbCy1SH2FSuTxkARMc2x6Lzw.x4ax0ybpoXJLIrl8u").roles("admin").build();
        UserDetails pbkdf2 = User.withUsername("pbkdf2").password("{pbkdf2}ac487cc5d0df83aa3f4d130b1c94063feb6facfc597266175384b78eb432c382fe3aef332ffaff34").roles("admin").build();
        return new InMemoryUserDetailsManager(noop,bcypt,pbkdf2);
    }

验证登录
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3指定PasswordEncoder

注入Bean,代码如下:

 @Bean
   public PasswordEncoder passwordEncoder(){
       return new BCryptPasswordEncoder();
   }

验证登录
还是基于上面的配置,使用:noop/123456 bcrypt/123456 pbkdf2/123456 发现全部登录失败,截图如下:
在这里插入图片描述
因为我们现在指定了PasswordEncoder=BcryptPasswordEncoder,替代了默认的DelegatingPasswordEncoder,所以我们只需要将密码前缀{xxx}去掉就行,但是使用其他加密方式:pbkdf2/123456 和 noop/123456 还是登录不上,因为你使用的是BcryptPasswordEncoder进行密码匹配,所以需要更新密码。

代码如下:

@Bean
    public UserDetailsService userDetailsService(){
        UserDetails noop = User.withUsername("noop").password("{noop}123456").roles("admin").build();
        UserDetails bcypt = User.withUsername("bcrypt").password("$2a$10$MI6ueeZD8uhAbCy1SH2FSuTxkARMc2x6Lzw.x4ax0ybpoXJLIrl8u").roles("admin").build();
        UserDetails pbkdf2 = User.withUsername("pbkdf2").password("{pbkdf2}ac487cc5d0df83aa3f4d130b1c94063feb6facfc597266175384b78eb432c382fe3aef332ffaff34").roles("admin").build();
        return new InMemoryUserDetailsManager(noop,bcypt,pbkdf2);
    }

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

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

相关文章

【送书福利-第五期】《网络结构数据分析与应用》

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 送书福利-第五期 1、前言2、内容简介3、作…

CodeForces.1786A1.简单发牌.[简单][flg标识][找数学规律]

题目描述&#xff1a; 题目解读&#xff1a; 简单发牌问题&#xff0c;给两个人发牌&#xff0c;每次发牌数量依次递增&#xff0c; 给a发1张&#xff0c;然后给b发2&#xff0c;3张&#xff1b; 给a发4&#xff0c;5张&#xff0c;给b发6&#xff0c;7张&#xff1b; 给a发…

微信小程序【发送给朋友】和【复制链接】功能,灰色不可用

每日鸡汤&#xff1a;悲观者可能正确&#xff0c;但是乐观者往往成功 假设你是一个用户&#xff0c;你随便找一个小程序可以看到这几个功能 转发给朋友分享到朋友圈复制链接 很常见的功能&#xff0c;但是如果你作为开发者&#xff0c;这几个功能就需要自己做喽&#xff0c;并…

day9 - 对花朵图像进行边缘检测

本期主要介绍常用于进行图像边缘检测的滤波器&#xff08;算子&#xff09;&#xff1a;Sobel算子、Scharr算子、Laplacian算子&#xff1b;通过实验比较不同的算子的处理效果以及使用场景。 完成本期内容&#xff0c;你可以&#xff1a; 了解图像梯度的原理和应用 掌握使用S…

QxRibbon 知:搭建 PyQt5 环境

文章目录 安装 Python安装 PyQt5安装 PyCharm构建 QxRibbon参考资料 安装 Python 参考其它教程 安装 PyQt5 PyQt5 版本&#xff1a;5.15.2 运行 windows cmd.exe 命令提示符&#xff0c;通过下列方法进行安装&#xff08;友情提醒&#xff1a;关闭流氓软件 360&#xff09; …

B站w_rid逆向

文章目录 目标网站加密参数定位算法还原很久没有看过B站的项目了,正好有小伙伴问B站的w_rid咋逆向的, w_rid?初一听没啥印象啊,以前的B站应该没有这个东东,去看了一下,原来是更新了。 就看了下B站pc端作品列表,开始有校验w_rid了,本次目标就是逆向这个参数。 目标网…

Live800在线客服系统:客户体验即是业绩来源

“客户就是上帝”&#xff0c;这一论断在商业行为中早已成为不争的事实。 所有企业都知道&#xff0c;满足客户的需求才能让企业稳步发展。在产品同质化严重的今天&#xff0c;客户服务成为核心竞争力&#xff0c;试想一下&#xff0c;在产品、价格相差无几的两个企业中&#…

网络安全——应用层安全协议

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.应用层安全协议 1.应用层安全威胁 2.电子邮件安全协议 1.MIME协议 2.电…

es 二、核心概念

目录 Nrt cluster集群概念 node节点 Document 文档 Index 索引 Field字段 Type 类型 shard分片 Replica shard副本 数据库和es概念对比 Nrt 写入一秒后就能搜到 cluster集群概念 一台机器启动一个实例即可&#xff0c;多个组成 node节点 一个实例一个节点 Documen…

Hover.css动画库的使用

目录 1、 Hover.css是什么&#xff1f; 2、引入 2.1、整个文件引入 2.2、复制所需要的代码 案例&#xff1a; 1. 卷边效果 2. 调整大小的卷边 类别&#xff1a; 1、 Hover.css是什么&#xff1f; Hover.css是一个CSS3鼠标悬停的动画方案&#xff0c;里面包含了许多纯c…

Linux驱动入门(二)——嵌入式处理器介绍和构建驱动程序开发环境

文章目录 嵌入式处理器和开发板介绍处理器简述处理器种类Intel的PXA系列处理器StrongARM系列处理器MIPS处理器摩托罗拉龙珠(DragonBall)系列处理器日立SH3处理器德州仪器OMAP系列处理器 ARM处理器ARM处理器简介ARM处理器的特点ARM处理器系列ARM处理器的应用ARM处理器选型 STM32…

Netty实战(八)

引导 一、引导1.1 什么是引导1.2 Bootstrap 类1.3 引导客户端和无连接协议1.4 引导客户端1.5 Channel 和 EventLoopGroup 的兼容性 二、引导服务器2.1 ServerBootstrap 类2.2 引导服务器 三、从 Channel 引导客户端四、在引导过程中添加多个 ChannelHandler五、使用 Netty 的 C…

1.实验技术-收藏吃灰去,深入浅出常规PCR

1.PCR 原理与过程 2.PCR 体系组分 3.PCR 应用 4.PCR 常见问题及解决方案 前言 PCR&#xff08;Polymerase Chain Reaction&#xff0c;聚合酶链式反应&#xff09;是现代生物学中一项必不可少的技术&#xff0c;能进行体外扩增DNA序列&#xff0c;为基因组研究和分子诊断提供…

27事务管理AOP

一、MySQL事务回顾 二、Spring事务管理 Spring框架的第一大核心&#xff1a;IOC控制反转 在DeptServiceImpl下删除部门方法下新加一个删除员工信息的操作&#xff0c;注意&#xff1a;此时的id是部门id。 1、问题分析 2、Transactional-Spring事务管理 一般是在Service实现类的…

想用Python做副业?看这一篇就够了

大家好&#xff0c;我是耿直。 随着人工智能、大数据、物联网的广泛应用&#xff0c;与之紧密关联的Python技术开始受到人们的极大关注。各行业对Python技术服务的需求量呈指数级暴增&#xff0c;尤以爬虫技术服务为甚&#xff0c;供不应求早已成为常态。 而近两年受到各种不…

Springboot +spring security,实现RememberMe和实现原理分析

一.简介 我们在登录网站的时候&#xff0c;除了让你输入用户名和密码&#xff0c;还会有个勾选框&#xff1a; 记住我。 比如下面这个截图&#xff1a; Spring Security 也提供了这个功能&#xff0c;今天来实践下。 二.创建项目 如何创建一个SpringSecurity项目&#xff0…

【精】MySQL5.7没有row_number()函数如何组内排序和求分组topN

当我们遇到一些需求&#xff0c;比如组内分组排序&#xff0c;分组topN等&#xff0c;很容易想到用row_number()函数 ​在MySQL8.0版本中支持row_number函数&#xff0c;本文不做讨论&#xff0c;如果是MySQL5.7版本&#xff0c;要怎么写SQL呢&#xff1f; 测试表&#xff1a;…

Three.js教程:点、线、网格模型介绍

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 其他系列工具&#xff1a; NSDT简石数字孪生 点、线、网格模型介绍 经过前面几章学习相信你对点模型Points、线模型Line、网格模型Mesh已经有了大致了解&#xff0c;本节课就对点、线、网格模型模型进行简单总结。 点模型…

阿里大佬随手甩出一份覆盖全网的微服务架构笔记,让我涨薪60%

在这个凡事皆互联的时代&#xff0c;越来越多的人和物成为互联网上的节点&#xff0c;不断扩充着互联网这张大网的边界。节点即价值&#xff0c;更多的节点意味着更大的价值。 微服务在这个互联网时代依旧是最火热的技术之一&#xff0c;在当下互联网企业不懂微服务是不行的&a…

软件测试人员如何为项目的质量保障兜底?看完你就明白了...

上线前层层保障 01文档管理 关键词&#xff1a;需求文档、设计文档、测试文档 1.需求和设计产出方为产品、开发&#xff0c;测试需要做好流程监督&#xff0c;这里重点说下测试文档。 2.测试文档&#xff0c;从业务领域来说&#xff0c;一般有测试计划、测试用例、业务总结文…