【发布时间】:2015-12-06 14:53:12
【问题描述】:
我在现有应用程序中引入 Spring Security。目前 db 有我们想要迁移到 bcrypt 的 MD5 编码密码。由于我们最初拥有大量用户,我们希望同时支持 MD5 和 bcrypt。我们已经考虑过有一个表来存储有多少用户迁移到 bcrypt,一旦我们迁移了每个用户,我们将停止支持 MD5。
所以我想到了扩展 SpringSecurity 的 BCryptPasswordEncoder 类并在matches方法中做一些事情。所以我有下课,
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
public class CustomPasswordEncoder extends BCryptPasswordEncoder {
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
if (rawPassword == null || encodedPassword == null) {
return false;
}
if (!super.matches(rawPassword, encodedPassword)) { // This is not BCrypt password try OLD password encoding instead
boolean isOldPasswordMatched = rawPassword.equals(SHA1.getSHA1Hash(encodedPassword));
if(isOldPasswordMatched){
migrateToBCrypt(userName /* error here*/, encode(rawPassword));
}
return isOldPasswordMatched;
}
return true;
}
private boolean migrateToBCrypt(String userName, String newBcryptPassword){
//update password in database
//Insert to migrated table
return true;
}
}
但是我的问题是我没有在此函数中获取用户名来进行迁移,如何在密码编码器的匹配()中获取用户名?我在这里做错了吗?在这种情况下,最好的方法是什么?
【问题讨论】:
-
@user1354678 : 作者目前无法获取用户本身,当用户名本身未知时,您希望他/她如何检查passwordType?
-
@user1354678 我无法在此函数中获取用户名
-
@aProgrammer,我已经提出了答案,看看吧
-
@user1354678 目前我的设置中没有 userService 类实现。所以明天我会尝试,我还必须想办法将你的答案转换为 XML 配置。谢谢
标签: java jakarta-ee spring-security passwords bcrypt