欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

深入浅析Spring Security5中默认密码编码器

程序员文章站 2023-11-17 11:40:40
1.概述 在spring security 4中,可以使用内存中身份验证以纯文本格式存储密码。 对版本5中的密码管理过程进行了重大改进,为密码编码和解码引入了更安全的默...

1.概述

在spring security 4中,可以使用内存中身份验证以纯文本格式存储密码。

对版本5中的密码管理过程进行了重大改进,为密码编码和解码引入了更安全的默认机制。这意味着如果您的spring应用程序以纯文本格式存储密码,升级到spring security 5可能会导致问题。

在这个简短的教程中,我们将描述其中一个潜在的问题,并展示该问题的解决方案。

2. spring security 4

我们首先展示一个标准的安全配置,它提供简单的内存中身份验证(适用于spring 4):

@configuration
public class inmemoryauthwebsecurityconfigurer 
 extends websecurityconfigureradapter {
 
 @override
 protected void configure(authenticationmanagerbuilder auth) 
 throws exception {
 auth.inmemoryauthentication()
  .withuser("spring")
  .password("secret")
  .roles("user");
 }
 
 @override
 protected void configure(httpsecurity http) throws exception {
 http.authorizerequests()
  .antmatchers("/private/**")
  .authenticated()
  .antmatchers("/public/**")
  .permitall()
  .and()
  .httpbasic();
 }
}

此配置定义所有/私有/映射方法的身份验证以及/ public /下所有内容的公共访问。

如果我们在spring security 5下使用相同的配置,我们会收到以下错误:

java.lang.illegalargumentexception: there is no passwordencoder mapped for the id "null"

该错误告诉我们由于没有为我们的内存中身份验证配置密码编码器,因此无法解码给定的密码。

3. spring security 5

我们可以通过使用passwordencoderfactories类定义delegatingpasswordencoder来解决此错误。

我们使用此编码器通过authenticationmanagerbuilder配置我们的用户:

@configuration
public class inmemoryauthwebsecurityconfigurer 
 extends websecurityconfigureradapter {
 
 @override
 protected void configure(authenticationmanagerbuilder auth) 
 throws exception {
 passwordencoder encoder = passwordencoderfactories.createdelegatingpasswordencoder();
 auth.inmemoryauthentication()
  .withuser("spring")
  .password(encoder.encode("secret"))
  .roles("user");
 }
}

现在,通过这种配置,我们使用bcrypt以以下格式存储我们的内存中密码:

{bcrypt}$2a$10$mf7hynwlelt66gnccbgxaonzhbrsmjluofkp50sspbw2pjjuqu.zs

虽然我们可以定义自己的一组密码编码器,但建议坚持使用passwordencoderfactories中提供的默认编码器。

3.1.迁移现有密码

我们可以通过以下方式将现有密码更新为推荐的spring security 5标准:

更新纯文本存储密码及其编码值:

string encoded = new bcryptpasswordencoder().encode(plaintextpassword);

前缀散列存储的密码及其已知的编码器标识符:

{bcrypt}$2a$10$mf7hynwlelt66gnccbgxaonzhbrsmjluofkp50sspbw2pjjuqu.zs
{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0

当存储密码的编码机制未知时,请求用户更新其密码

4.结论

在这个快速示例中,我们使用新的密码存储机制将有效的spring 4内存中认证配置更新到spring 5。

与往常一样,您可以在github项目中找。

总结

以上所述是小编给大家介绍的spring security 5中默认密码编码器,希望对大家有所帮助