1. 概述

Spring Boot CLI(命令行接口)是Spring Boot提供的一款用于在命令提示符下运行和测试Spring Boot应用的工具。该工具的一个重要特性是密码编码,其主要目标是避免明文密码的暴露,而是能够生成并使用编码后的密码

在这个教程中,我们将深入Spring Security的世界,学习如何使用Spring Boot CLI进行密码编码

2. 密码编码

密码编码是将密码以二进制格式保存到存储介质上的方式。我们可以使用Spring Security进行密码编码,也可以通过Spring Boot CLI来实现。

2.1. Spring Security PasswordEncoder

Spring Security提供了PasswordEncoder接口,它有多种实现,如StandardPasswordEncoderBCryptPasswordEncoder等。

此外,Spring Security推荐使用基于强大算法且随机生成盐的BCryptPasswordEncoder。在框架的早期版本中,MD5PasswordEncoderSHAPasswordEncoder类也曾被使用,但由于其算法的脆弱性,现在已被弃用。

这两个类要求开发者在构造函数中传递盐值,而BCryptPasswordEncoder会内部生成一个随机的盐。BCryptPasswordEncoder生成的字符串长度为60个字符,因此存储字段应能接受这样的字符串大小。

另一方面,StandardPasswordEncoder基于SHA-256算法。

显然,第三方系统中创建的用户密码必须根据Spring Security选择的编码类型进行编码,才能成功进行身份验证。

2.2. Spring Boot CLI 密码编码器

Spring Boot CLI包含一系列命令,其中一个就是encodepassword。这个命令允许我们使用Spring Security对密码进行编码。简单来说,Spring Boot CLI的encodepassword命令可以直接将明文密码转换为加密密码,语法如下:

spring encodepassword [options] <password to encode>

值得注意的是,从Spring Security 5.0开始,默认的密码编码机制是BCrypt

3. 示例

为了明确展示如何使用Spring Boot CLI的密码编码机制,我们将使用一个基本的认证服务,通过用户名和密码验证用户。在这个示例中,我们将简单地使用Spring Security的自动配置。

我们的目标是避免明文密码的显示,而是使用编码后的密码。现在让我们看看如何使用encodepassword命令在Spring Boot CLI中编码密码。只需在命令提示符中执行以下命令:

spring encodepassword baeldungPassword

上述命令的结果是一个经过BCrypt加密的密码,非常难以破解。例如,在Spring Boot Security配置中使用的编码密码可能如下所示:

{bcrypt}$2y$10$R8VIwFiQ7aUST17YqMaWJuxjkCYqk3jjPlSxyDLLzqCTOwFuJNq2a

接下来,我们将自定义默认的安全配置,修改属性文件。例如,我们可以覆盖默认的用户名和密码,添加自己的。

我们的编码密码将存储在spring.security.user.password属性中:

spring:
  security:
    user:
      name: baeldung
      password: '{bcrypt}$2y$10$R8VIwFiQ7aUST17YqMaWJuxjkCYqk3jjPlSxyDLLzqCTOwFuJNq2a'

4. 总结

在这篇文章中,我们了解了如何使用Spring Boot CLI进行密码编码,并通过Spring Security的基本身份验证演示了如何使用编码密码。主要目标是避免明文密码的暴露,并轻松生成编码后的密码。

如往常一样,本教程的完整代码可以在GitHub上找到。