diff --git a/ballcat-common/ballcat-common-security/src/main/java/com/hccake/ballcat/common/security/util/PasswordUtils.java b/ballcat-common/ballcat-common-security/src/main/java/com/hccake/ballcat/common/security/util/PasswordUtils.java
index 9307dd22..2a91156d 100644
--- a/ballcat-common/ballcat-common-security/src/main/java/com/hccake/ballcat/common/security/util/PasswordUtils.java
+++ b/ballcat-common/ballcat-common-security/src/main/java/com/hccake/ballcat/common/security/util/PasswordUtils.java
@@ -4,10 +4,17 @@ import cn.hutool.core.codec.Base64;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.AES;
+import org.springframework.security.crypto.argon2.Argon2PasswordEncoder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.factory.PasswordEncoderFactories;
+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.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
/**
* 前后端交互中密码使用 AES 加密,模式: CBC,padding: PKCS5,偏移量暂不定制和密钥相同。
@@ -22,7 +29,36 @@ public final class PasswordUtils {
private PasswordUtils() {
}
- public static final PasswordEncoder ENCODER = new BCryptPasswordEncoder();
+ /**
+ * 创建一个密码加密的代理,方便后续切换密码的加密算法
+ * @see PasswordEncoderFactories#createDelegatingPasswordEncoder()
+ * @return DelegatingPasswordEncoder
+ */
+ @SuppressWarnings("deprecation")
+ private static PasswordEncoder createDelegatingPasswordEncoder() {
+ String encodingId = "bcrypt";
+ Map encoders = new HashMap<>(10);
+ BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
+ encoders.put(encodingId, 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());
+ DelegatingPasswordEncoder delegatingPasswordEncoder = new DelegatingPasswordEncoder(encodingId, encoders);
+
+ // 设置默认的密码解析器,以便兼容历史版本的密码
+ delegatingPasswordEncoder.setDefaultPasswordEncoderForMatches(bCryptPasswordEncoder);
+ return delegatingPasswordEncoder;
+ }
+
+ public static final PasswordEncoder ENCODER = PasswordUtils.createDelegatingPasswordEncoder();
/**
* 将前端传递过来的密文解密为明文
@@ -51,12 +87,30 @@ public final class PasswordUtils {
}
/**
- * 使用BCrypt加密密码
- * @param password 明文密码
- * @return BCrypt加密后的密码
+ * 加密密码
+ * @param rawPassword 明文密码
+ * @return 密文密码
*/
- public static String encodeBCrypt(String password) {
- return ENCODER.encode(password);
+ public static String encode(CharSequence rawPassword) {
+ return ENCODER.encode(rawPassword);
}
+ /**
+ * 判断明文密码和密文密码是否匹配
+ * @param rawPassword 明文密码
+ * @param encodedPassword 密文密码
+ * @return 匹配返回 true
+ */
+ public static boolean matches(CharSequence rawPassword, String encodedPassword) {
+ return ENCODER.matches(rawPassword, encodedPassword);
+ }
+
+ /**
+ * 判断是否需要升级加密算法
+ * @param encodedPassword 密文密码
+ * @return 需要返回 true
+ */
+ public static boolean upgradeEncoding(String encodedPassword) {
+ return ENCODER.upgradeEncoding(encodedPassword);
+ }
}
diff --git a/ballcat-system/ballcat-system-biz/src/main/java/com/hccake/ballcat/system/service/impl/SysUserServiceImpl.java b/ballcat-system/ballcat-system-biz/src/main/java/com/hccake/ballcat/system/service/impl/SysUserServiceImpl.java
index c33016c6..59df6080 100644
--- a/ballcat-system/ballcat-system-biz/src/main/java/com/hccake/ballcat/system/service/impl/SysUserServiceImpl.java
+++ b/ballcat-system/ballcat-system-biz/src/main/java/com/hccake/ballcat/system/service/impl/SysUserServiceImpl.java
@@ -138,10 +138,10 @@ public class SysUserServiceImpl extends ExtendServiceImpl