Spring Security内置许多密码加密器
PasswordEncoder接口
PasswordEncoder 接口表示密码器,负责密码校验、加密。
public interface PasswordEncoder {
// 加密
String encode(CharSequence var1);
// 密码比对
boolean matches(CharSequence var1, String var2);
// 是否需要对密码进行升级
default boolean upgradeEncoding(String encodedPassword) {
return false;
}
}
PasswordEncoder代理类之DelegatingPasswordEncoder
DelegatingPasswordEncoder 类使用代理模式,内部维护一系列 PasswordEncoder 的实现类。它加密密码的格式是 {id}encodepassword 。我们可以通过 id 找到对应 PasswordEncoder加密器。
public String encode(CharSequence rawPassword) {
return "{" + this.idForEncode + "}" + this.passwordEncoderForEncode.encode(rawPassword);
}
对密码进行升级
假设我们有个需求:以前旧系统存储密码的方式是基于明文的,这样会很不安全。现在需要对密码的安全进行升级,也就是对明文进行加密存储,这样可以保证用户信息的安全。那该如何实现呢?
答案是:PasswordEncoder 接口和 UserDetailsPasswordService 接口。
public interface UserDetailsPasswordService {
// 更新密码
UserDetails updatePassword(UserDetails var1, String var2);
}
基于前面数据库登录认证进行改造,我们只需要更改几处地方即可。我就列出关键的地方。
加密器改造
之前加密器是明文比对,现在我们使用 BCryptPasswordEncoder 加密器,并重现 upgradeEncoding 方法
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder() {
@Override
public boolean upgradeEncoding(String encodedPassword) {
return encodedPassword.length() <= 10;
}
};
}
UserService改造
我们需要把升级后的密码更新到数据库去,我们需要让 UserService 实现 UserDetailsPasswordService 接口。
@Override
public UserDetails updatePassword(UserDetails userDetails, String newPassword) {
String username = userDetails.getUsername();
userMapper.updatePasswordByUsername(newPassword, username);
((User) userDetails).setPassword(newPassword);
return userDetails;
}
这样,我们就完成对旧系统密码升级的工作了。
备注
本系列都是学习《深入浅出Spring Security》的笔记
本文介绍了Spring Security中PasswordEncoder接口及其代理类DelegatingPasswordEncoder的使用,详细讲解了如何对旧系统的明文密码进行安全升级,通过实现特定的加密器改造UserService,确保用户信息安全。
1206

被折叠的 条评论
为什么被折叠?



