Spring Security 无法理解Spring安全性的多编码类型用法

qhhrdooz  于 2023-08-05  发布在  Spring
关注(0)|答案(1)|浏览(119)

我正在尝试理解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);

字符串
}
我在试着理解。

bjp0bcyl

bjp0bcyl1#

Map<String, PasswordEncoder> encoders = new HashMap<>();
encoders.put("noop", NoOpPasswordEncoder.getInstance());
encoders.put("bcrypt", new BCryptPasswordEncoder());
encoders.put("scrypt", new SCryptPasswordEncoder());
PasswordEncoder  passwordEncoder = new DelegatingPasswordEncoder("bcrypt", encoders);

字符串
传递给DelegatingPasswordEncoder的构造函数的bcrypt指定使用哪种算法对普通密码进行编码。
如果你打电话:

passordEncoder.encode("somePassword")


它将始终使用BCryptPasswordEncoder来编码此密码。编码密码将以{bcrypt}为前缀。
传递给DelegatingPasswordEncoder的编码器Map用于检查编码密码是否与原始密码匹配。因此,只有当你调用:

passordEncoder.matches("rawPassword" , "encodedPassword")


如果编码密码以下列前缀开头,则将使用相应的编码器。

  • 对于前缀{noop},使用NoOpPasswordEncoder
  • 对于前缀{bcrypt},使用BCryptPasswordEncoder
  • 对于前缀{scrypt},使用SCryptPasswordEncoder

如果编码的密码不以这些前缀中的任何一个开头,它将抛出异常,抱怨它无法确定使用哪个密码编码器。
主要是为了解决文件中提到的以下问题:

  • 许多应用程序使用旧的密码编码,无法轻松迁移。
  • 密码存储的最佳实践将再次更改。
  • 作为一个框架,Spring Security不能频繁地进行破坏性更改。

该想法还存储关于使用哪种密码编码算法来在最终编码的密码值中编码密码的信息。因此,如果将来我们改变使用另一种更好的算法来编码新用户的密码,我们仍然有足够的信息来知道应该使用哪种算法来匹配旧用户的密码。否则,如果我们简单地将其更改为使用新的编码算法,则旧用户将受到影响。

相关问题