PasswordEncoder 优化
Hccake opened this issue · 2 comments
用户密码修改时使用的加密方式不应该使用 PasswordUtils 中提供的默认 PasswordEncoder。
应该从容器中获取,以便保持和 auth 中的一致,也方便用户替换自己的 PasswordEncoder。
加密方式这里是否考虑通过SPI机制去实现是否会更好,内置默认加密方式,用户也可使用自己的加密方式
加密方式这里是否考虑通过SPI机制去实现是否会更好,内置默认加密方式,用户也可使用自己的加密方式
设计之初就提供了这样的机制,用户可以通过自定义 PasswordEncoder 实现密码加解密方式替换,目前主要是修改密码这里写死了,需要修改。
当前实现
目前登录时,会利用注册在 spring 容器中的密码编码器 PasswordEncoder 实例,进行密码的加密以及匹配:
ballcat 默认的 PasswordEncoder 使用的是 DelegatingPasswordEncoder(用户可以自己注册 PasswordEncoder 进行替换这一行为),使用该密码编码器加密时获得的密文格式为:{bcrypt}算法密文
,进行密码匹配测试时使用的数据格式为:{加密算法}算法密文
。
目前支持以下加密算法,当加密算法部分为空时,默认使用 bcrypt 算法。
- bcrypt
- ldap
- MD4
- MD5
- noop
- pbkdf2
- scrypt
- SHA-1
- SHA-256
- sha256
- sha256
示例
如明文密码:a123456
使用 MD5 加密后的的密文为 dc483e80a7a0bd9ef71d8cf973673924
使用 bcrypt 加密后的密文为 $2a$10$iBJZLHRVrjpJCKVNUZw6B.wbdClhvVdT91KbN25sTjbn1MJT4wqmm
那么,当使用 DelegatingPasswordEncoder 进行匹配时,以下几种数据都将返回 true:
$2a$10$iBJZLHRVrjpJCKVNUZw6B.wbdClhvVdT91KbN25sTjbn1MJT4wqmm
{bcrypt}$2a$10$iBJZLHRVrjpJCKVNUZw6B.wbdClhvVdT91KbN25sTjbn1MJT4wqmm
{MD5}dc483e80a7a0bd9ef71d8cf973673924
{noop}a123456
也就是说在 sys_user 表中的 password 字段,支持同时存在多种加密方式,方便密码加密算法的迁移