在之前的文章中密码都是使用明文的方式进行存储,但这样会有很大的安全隐患。所以正常做系统时,密码都要加密处理。而在 Spring Boot 中配置密码加密非常容易,下面通过样例进行演示。
九、密码加密配置
1、样例代码
(1)要配置密码加密只需要修改两个地方。首先要修改 HttpSecurity 配置中的 PasswordEncoder 这个Bean 的实现,这里我们采用 BCryptPasswordEncoder 加密方案。
Spring Security 提供了多种密码加密方案,官方推荐使用 BCryptPasswordEncoder:
- BCryptPasswordEncoder 使用 BCrypt 强哈希函数,开发者在使用时可以选择提供 strength 和 SecureRandom 实例。
- strength 取值在 4~31 之间(默认为 10)。strength 越大,密钥的迭代次数越多(密钥迭代次数为 2^strength)
(2)接着将用户的密码改成使用 BCryptPasswordEncoder 加密后的密码(如果是数据库认证,库里的密码同样也存放加密后的密码)
注意:虽然这里三个用户加密后的密码不一样,但明文其实都是 123。这是因为即使同一密码每次 Bcrypt 生成的结果都会变化
1@Configuration 2public class MyWebSecurityConfig extends WebSecurityConfigurerAdapter { 3 // 指定密码的加密方式 4 @Bean 5 PasswordEncoder passwordEncoder(){ 6 // 使用BCrypt强哈希函数加密方案,密钥迭代次数设为10(默认即为10) 7 return new BCryptPasswordEncoder(10); 8 } 9 10 // 配置用户及其对应的角色 11 @Override 12 protected void configure(AuthenticationManagerBuilder auth) throws Exception { 13 auth.inMemoryAuthentication() 14 .withUser("root") 15 .password("$2a$10$OahHKAjiYRxJb9eBeDNeTe0HapawUSY5qYRl/6O2qJUyK58ontFwW") 16 .roles("DBA") 17 .and() 18 .withUser("admin") 19 .password("$2a$10$nwG.X7cRIkRUN0siaaXI6uDnbZuB1XCnQK7KQ1sRWat69fIKF8ste") 20 .roles("ADMIN") 21 .and() 22 .withUser("hangge") 23 .password("$2a$10$AkEWXIFbKRDlypQ.kQxNDu.85ZCuiv77CGJLikwLxURDrVav6IDpy") 24 .roles("USER"); 25 } 26 27 // 配置 URL 访问权限 28 @Override 29 protected void configure(HttpSecurity http) throws Exception { 30 http.authorizeRequests() // 开启 HttpSecurity 配置 31 .antMatchers("/db/**").hasRole("DBA") // db/** 模式URL需DBA角色 32 .antMatchers("/admin/**").hasRole("ADMIN") // admin/** 模式URL需ADMIN角色 33 .antMatchers("/user/**").hasRole("USER") // user/** 模式URL需USER角色 34 .anyRequest().authenticated() // 用户访问其它URL都必须认证后访问(登录后访问) 35 .and().formLogin().loginProcessingUrl("/login").permitAll() // 开启表单登录并配置登录接口 36 .and().csrf().disable(); // 关闭csrf 37 } 38}
2、运行测试
启动项目后,我们仍然使用 123 这个密码进行登录。

附:生成 Bcrypt 密码
通常来说用户信息是存储在数据库中,因此需要在用户注册时对密码进行加密处理。下面代码作用是当用户将密码从前端传过来之后,通过调用 BCryptPasswordEncoder 实例中的 encode 方法对密码进行加密处理,加密完成后将密文存入数据库。
1@Service 2public class RegService { 3 public int reg(String username, String password) { 4 BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(10); 5 String encodePasswod = encoder.encode(password); 6 return saveToDb(username, encodePasswod); 7 } 8}