我正在尝试理解Spring Security的多重编码。
考虑,我有一个用户名/密码的注册.
**简单地调用PasswordEncoder.encode(password)它将如何决定必须发生哪种类型的编码?
另外,如果我直接给予BCrypt对象返回,它不被认为是多重权。自动地,Spring本身将如何理解,使用我已经给出的实现编码类型(noop/bcrypt/scrypt)**。
public PasswordEncoder passwordEncoder() {
Map<String, PasswordEncoder> encoders = new HashMap<>();
encoders.put("noop", NoOpPasswordEncoder.getInstance());
encoders.put("bcrypt", new BCryptPasswordEncoder());
encoders.put("scrypt", new SCryptPasswordEncoder());
return new DelegatingPasswordEncoder("bcrypt", encoders);
}
private final PasswordEncoder passwordEncoder;
public UserAccount register(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam("firstName") String firstName, @RequestParam("lastName") String lastName) {
UserAccount userAccount = new UserAccount();
userAccount.setUsername(username);
userAccount.setPassword(passwordEncoder.encode(password));
return userAccountRepository.save(userAccount);
字符串
}
我在试着理解。
1条答案
按热度按时间bjp0bcyl1#
字符串
传递给
DelegatingPasswordEncoder
的构造函数的bcrypt
指定使用哪种算法对普通密码进行编码。如果你打电话:
型
它将始终使用
BCryptPasswordEncoder
来编码此密码。编码密码将以{bcrypt}
为前缀。传递给
DelegatingPasswordEncoder
的编码器Map用于检查编码密码是否与原始密码匹配。因此,只有当你调用:型
如果编码密码以下列前缀开头,则将使用相应的编码器。
{noop}
,使用NoOpPasswordEncoder
{bcrypt}
,使用BCryptPasswordEncoder
{scrypt}
,使用SCryptPasswordEncoder
如果编码的密码不以这些前缀中的任何一个开头,它将抛出异常,抱怨它无法确定使用哪个密码编码器。
主要是为了解决文件中提到的以下问题:
该想法还存储关于使用哪种密码编码算法来在最终编码的密码值中编码密码的信息。因此,如果将来我们改变使用另一种更好的算法来编码新用户的密码,我们仍然有足够的信息来知道应该使用哪种算法来匹配旧用户的密码。否则,如果我们简单地将其更改为使用新的编码算法,则旧用户将受到影响。