简单来说,Security提供了多种的加密方式,我们只需要通过注入不同的PasswordEncoder的实例对象到Spring容器中,Security就会采用不同的加密方式为我们提供服务
eg:举个栗子,我们采用注入BCryptPasswordEncoder的方式指定密码编辑器
此时Security就会采用该实例对象的加密方式为我们进行密码的加密操作,比如123加密之后就变成了$2a$10$TKMFT4Wm7GkeLNRHbL39Ge5AkccoEgwnXxiDNPyA3nc9t7D.Om7fO
在我们进行登录的时候,security就会将前端接收到的password用该密码编辑器进行加密,加密之后再和数据库查询出来的密码进行比对,如果相同则代表用户认证成功(因此注册的时候记得使用相同的密码编辑器进行加密后再存储密码,否则加密出来后对应不上就会导致认证失败哦!)
简单来说,我们提供什么PasswordEncoder实例,Security就会在认证的时候采用相同的加密方式将传入的password进行加密,然后与数据库查询出来的密码进行比对
DelegatingPasswordEncoder
由于Security为不同的密码加密方式提供了不同的前缀id,比如使用明文存储我们需要使用{noop}将其标注,如{noop}123,代表密码明文存储的123,这样security就不会采用passwordEncoder加密后再进行比对。其他的加密方式也有不同的前缀id,比如md5加密或BCrypt加密都有不同的前缀id,而DelegatingPasswordEncoder会根据数据库查询出来的密码的不同前缀,采用不同的加密方式加密接收的password后再和数据库密码比对,利用这个特性就算数据库用多种不同的加密方式的密码,也可以顺利认证,这个好像是security默认的密码编辑器,但是可能由于兼容性好但效率较低的原因一般都会替换为某一种单独的密码编辑器如BCrypt
不过感觉一般用不太上,除非是运行了很久历经了很多不同加密时代的系统了,不过Security还提供了将数据库密码升级成指定加密方式的功能,比如将数据库的md5加密密码全部升级成Bcrypt,有兴趣的小伙伴可以去了解一下