安全顶部

我刚宣布了新的学习Spring Security课程,包括全部材料专注于春季安全的新OAuth2堆栈5:

>>查看课程

1.概述

在Spring Security 4中,可以使用内存身份验证将密码存储在纯文本中。

版本5中密码管理过程的重大大修已经引入了更安全的默认机制,用于编码和解码密码。这意味着如果您的Spring应用程序在纯文本中存储密码,则升级到Spring Security 5可能会导致问题。

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

2.春天安全4

我们将首先显示提供简单内存身份验证的标准安全配置(对于Spring 4有效):

@configuration公共类InmemoryauthwebseecurityConfigurer扩展了WebSecurityConfigurerAdapter {@Override保护的void配置(AuthenticationManagerBuilder Auth)抛出异常{auth.inmemoryauthentication().withuser(“spring”).password(“秘密”).oroles(“用户”);@Override受保护的void配置(Httpsecurity HTTP)抛出异常{http.authorizeRequests().antmatchers(“/ private / **”).Authenticated().Artmatchers(“/ public / **”).permitall().and().httpbasic();}}

此配置定义了所有的身份验证/私人的/映射的方法和公共访问的一切/上市/。

如果我们在Spring Security 5下使用相同的配置,我们将收到以下错误:

java.lang.illegalargumentException:没有映射ID“null”的passwordencoder

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

3.春天安全5

我们可以通过定义一个来解决此错误委派passwordencoder.与之passwordencoderfactories.班级。

我们使用此编码器配置我们的用户AuthenticationManagerBuilder:

@configuration公共类InmemoryauthwebseecurityConfigurer扩展了WebSecurityConfigurerAdapter {@Override受保护的void配置(AuthenticationManagerBuilder Auth)抛出异常{passwordencoder encoder = passwordencoderfactorizes.createdelegationPasswordencoder();auth.inmemoryauthentication().Withuser(“spring”).password(encoder.encode(“秘密”)).oroles(“用户”);}}

使用此配置,我们正在使用以下格式使用Bcrypt存储内存密码:

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

虽然我们可以定义自己的密码编码器,但建议坚持下去默认的编码器提供passwordencoderfactories.

3.2。nooppasswordencoder.

如果出于任何原因,我们不想编码配置的密码,我们可以使用nooppasswordencoder.

为此,我们只需为我们提供的密码前缀密码()方法与{等待}标识符:

@configuration公共类InmemorynoopauthwebseecurityConfigurer扩展了WebSecurityConfigurerAdapter {@Override保护的void配置(AuthenticationManagerBuilder Auth)抛出异常{auth.inmemoryauthentication().withuser(“spring”).password(“{noop}秘密”).oroles(“用户”);}}

这样,Spring Security将使用nooppasswordencoder.当它将用户提供的密码与我们上面配置的密码进行比较时。

但是要注意,我们永远不应该在生产应用程序中使用这种方法!正如官方文件所说,nooppasswordencoder.已被弃用表示它是遗留的实现,并使用它被认为是不安全的

3.3。迁移现有密码

我们可以通过以下方法将现有密码更新为推荐的Spring Security 5标准:

  • 更新明文存储的密码,并对其值进行编码:
字符串编码= new bcryptpasswordencoder()。编码(plaintextpassword);
  • 使用其已知的编码器标识符前缀已存储的密码:
{bcrypt} $ 10 $ 10 $ mf7hynwlelt66gnccbgxaonzhbrsmjuofkp50sspbw2pjjuqu.zs {sha256} 97cde38028ad898ebc028c620069940309900069903C6200069903CF62000690CFFFAF8410849F27605ABCBC0
  • 请求用户在存储密码的编码机制未知时更新其密码

4。结论

在此快速示例中,我们使用新的密码存储机制将有效的Spring 4内存身份验证配置更新为Spring 5。

一如既往,您可以找到源代码GitHub项目

安全底

我刚宣布了新的学习Spring Security课程,包括全部材料专注于春季安全的新OAuth2堆栈5:

>>查看课程
对这篇文章的评论关闭!