1、概览 {#1概览}
Spring Boot CLI 是一个 Spring Boot 工具,用于从命令运行和测试 Spring Boot 应用。该工具提供了一个非常有用的密码编码功能,主要目的是避免暴露明文形式的密码。
在本教程中,我们将深入 Spring Security 的世界,学习如何使用 Spring Boot CLI 对密码进行编码。
2、密码编码 {#2密码编码}
密码编码是一种将密码以二进制格式表示并保存在存储介质上的简单方法。我们可以使用 Spring Security 对密码进行编码,也可以通过 Spring Boot CLI 进行编码。
2.1、Spring Security PasswordEncoder
{#21spring-security-passwordencoder}
Spring Security 提供了 PasswordEncoder
接口,并且预置了很多实现,如 StandardPasswordEncoder
和 BCryptPasswordEncoder
。
此外,Spring Security 建议使用基于强大算法和随机生成盐值的 BCryptPasswordEncoder
。在框架的早期版本中,可以使用 MD5PasswordEncoder
或 SHAPasswordEncoder
类,但由于其算法的弱点,它们现在已被弃用,这两个类强制开发者将盐作为构造函数参数传递。而 BCryptPasswordEncoder
将在内部生成随机盐,BCryptPasswordEncoder
生成的字符串大小为 60 个字符。
而 StandardPasswordEncoder
类则基于 SHA-256 算法。
显然,在第三方系统中创建的用户密码必须按照 Spring Security 中选择的编码类型进行编码,这样才能成功进行身份认证。
2.2、Spring Boot CLI Password Encoder {#22spring-boot-cli-password-encoder}
Spring Boot CLI 提供了许多命令,其中之一就是 encodepassword
。该命令允许对密码进行编码,以便与 Spring Security 配合使用。简单地说,Spring Boot Cli 可以使用这种简单的 encodepassword
命令直接将原始密码转换为加密密码:
spring encodepassword [options] <password to encode>
需要注意的是,从 Spring Security 5.0 开始,密码编码的默认机制是 BCrypt
。
3、示例 {#3示例}
为了说明如何使用 Spring Boot CLI 的密码编码机制,我们将使用基本身份认证服务,通过用户名和密码对用户进行身份认证。在本示例中,我们将简单地使用 Spring Security 自动配置。
这样做的目的是避免暴露明文密码,而是使用编码密码。现在,让我们看看如何使用 encodepassword
命令在 Spring Boot CLI 中对密码进行编码。
在命令行中执行以下命令:
$ spring encodepassword springdoc
{bcrypt}$2a$10$OBaoott9LzZt.XebZ2ae4.wflIKwYcfmoXGLZMCgtRWce1ZS0RUIW
执行后,会在控制台输出使用 BCrypt
加密的密码,很难被破解。可以在 Spring Boot Security 配置中使用。
现在,让我们通过修改 yaml 文件来定制默认的 security 配置。例如,我们可以通过添加自己的用户名和密码来覆盖默认用户名和密码。
把编码后的密码设置到 spring.security.user.password
属性:
spring:
security:
user:
name: springdoc
password: '{bcrypt}$2a$10$OBaoott9LzZt.XebZ2ae4.wflIKwYcfmoXGLZMCgtRWce1ZS0RUIW'
4、总结 {#4总结}
在本文中,我们学习了如何使用 Spring Boot CLI 轻松地对密码进行编码,主要目的是避免暴露明文密码。此外,我们还演示了如何在 Spring Security 中使用编码后的密码进行简单身份的认证。
参考:https://www.baeldung.com/spring-boot-cli-encode-passwords