转载请注明出处 http://www.cnblogs.com/majianming/p/7923604.html

最近在学习spring security,但是在设置客户端密码时,一直出现了一下错误提示,原来没有问题的,认真上次到现在这之间的时间动了什么,我想到了我把 spring security 升级到了5.0.0,应该是这里的问题,那么总需要解决,回退也不是方法吧

仔细查找资料,发现了一下两篇资料,其实是一样的意思

https://spring.io/blog/2017/11/01/spring-security-5-0-0-rc1-released#password-storage-updated

https://docs.spring.io/spring-security/site/docs/5.0.0.RELEASE/reference/htmlsingle/#ns-password-encoder

这个是原文

Password storage has undergone a major overhaul to provide more secure defaults and the ability to migrate how passwords are stored. The default PasswordEncoder is now DelegatingPasswordEncoder which is a non-passive change. This change ensures that passwords are now encoded using BCrypt by default, allows for validating passwords in old formats, and allows for upgrading the password storage in the future.

我简单理解了一下,意思就是为了更加安全,所以就需要添加这个类型(id)

如果没有加密的时候(也即是明文保存),需要改为这样,假设明文密码是password

password -> {noop}password // noop是no operate的意思,也就是说明保存的密码没有做加密操作

总的来说就是在spring security 4的密码格式上添加了密码类型的标记,并将这个标记使用花括号包裹放在密码密文的前面,形成spring security 5 的密码格式

加密类型支持(为了方便书写,这里假设各类加密方式加密后的密码密文是password)

加密方式 原来security 4的密码格式 现在security 5的密码格式
bcrypt password {bcrypt}password
ldap password {ldap}password
MD4 password {MD4}password
MD5 password {MD5}password
noop password {noop}password
pbkdf2 password {pbkdf2}password
scrypt password {scrypt}password
SHA-1 password {SHA-1}password
SHA-256 password {SHA-256}password
sha256 password {sha256}password

接下来介绍一下分析。如果我们不添加这个类型会怎么样,我们查看 org.springframework.security.crypto.password.DelegatingPasswordEncoder 这个类,在里面一个内部类UnmappedIdPasswordEncoder的matches方法抛出了一个异常信息There is no PasswordEncoder mapped for the id \"" + id + "\"",这不就是我们抛出的异常吗?

继续看看代码,在DelegatingPasswordEncoder初始化成员变量时候 ,有这样的定义

private PasswordEncoder defaultPasswordEncoderForMatches = new UnmappedIdPasswordEncoder();

也就是说这里将UnmappedIdPasswordEncoder()设置为了默认,在matches函数中

String id = extractId(prefixEncodedPassword);
PasswordEncoder delegate = this.idToPasswordEncoder.get(id);
if(delegate == null) {
return this.defaultPasswordEncoderForMatches
.matches(rawPassword, prefixEncodedPassword);
}

这里,调用了默认的matches函数,也就是UnmappedIdPasswordEncoder的matches,如果设置在数据库密码没有带{}这样的标记,或者标记里的encode id 没有在声明的id 集合内(id集合是什么?也就是上面表格中所支持的加密格式,在运行时候DelegatingPasswordEncoder的构造函数打个断点就知道了,其实就是idToPasswordEncoder这个变量的值,这个值定义PasswordEncoderFactories类中),那么它就抛出异常。

String prefixEncodedPassword) {
String id = extractId(prefixEncodedPassword);
throw new IllegalArgumentException("There is no PasswordEncoder mapped for the id \"" + id + "\"");

转载请注明出处 http://www.cnblogs.com/majianming/p/7923604.html


使用版本:
spring security 5.0.0.RELEASE

最新文章

  1. 用grunt搭建web前端开发环境
  2. 视图xsl定制之嵌入服务器控件
  3. SpringMVC @RequestBody接收Json对象字符串
  4. centos7+redis+php环境配置
  5. z-index 详解
  6. linux的mount(挂载)命令详解
  7. nim的引用和指针
  8. phpstorm配置代码自动同步到服务器
  9. 透过现象看现象(SQL501N错误处理)
  10. ubuntu 13.10 Ralink RT3290 无线与蓝牙4.0的驱动安装
  11. 【Xamarin笔记】Events, Protocols and Delegates
  12. sudo: 无法解析主机:<主机名>
  13. 【原】Storm 入门教程目录
  14. 迷你template
  15. jQuery实现密保互斥问题
  16. Android 通过网络打开自己的APP(scheme)
  17. EL与JSTL
  18. Hadoop 发行版本 Hortonworks 安装详解(一) 准备工作
  19. 实验吧_天下武功唯快不破&让我进去(哈希长度拓展攻击)
  20. Erlang简单并行服务器

热门文章

  1. Linux:普通用户不能执行ifconfig命令问题
  2. ORA-03113: end-of-file on communication channel (通信通道的文件结尾)
  3. Peach+Fuzzer
  4. 1、VGG16 2、VGG19 3、ResNet50 4、Inception V3 5、Xception介绍——迁移学习
  5. 确定mapkeeper使用的leverdb库路径
  6. mfc为对话框添加启动画面
  7. c++ primer 5th学习时间轴[ 100% ]
  8. APP开发过程中需求变更流程
  9. 2-1Java简介
  10. 图数据库初探之Neo4j