内容简介:[译] 学习 Spring Security(六):密码编码
本文将讨论注册流程中的一个关键部分 — 密码编码 (以非明文方式存储密码)。
Spring Security 支持一部分编码机制 — 本文将使用 BCrypt 编码方式,因为它通常被作为最佳的解决方案。
大多数其他机制,如 MD5PasswordEncoder 和 ShaPasswordEncoder 使用了较弱算法的编码方式,现在已被弃用了。
2、定义密码编码器
我们首先在配置中将 BCryptPasswordEncoder 定义为一个 bean:
@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }
一些旧的实现方式,比如 SHAPasswordEncoder ,会要求客户端在编码密码时传入一个 salt 值(又称盐值)。
然而 BCrypt 方式不同,它会在内部产生一个随机盐值。这很重要,因为这意味着每次调用都会有不同的结果,因此我们只需要对密码进行一次编码。
另外请注意, BCrypt 算法会生成一个长度为 60 的字符串,因此我们需要确保存储密码的列有足够的空间。一个常见的错误是创建一个长度不足的列,然后在验证时得到一个无效的用户名或密码错误。
3、在注册时编码密码
在用户注册流程中,我们使用 UserService 中的 PasswordEncoder 对密码进行散列处理:
示例 3.1 — UserService 对密码散列处理
@Autowired private PasswordEncoder passwordEncoder; @Override public User registerNewUserAccount(UserDto accountDto) throws EmailExistsException { if (emailExist(accountDto.getEmail())) { throw new EmailExistsException( "There is an account with that email adress:" + accountDto.getEmail()); } User user = new User(); user.setFirstName(accountDto.getFirstName()); user.setLastName(accountDto.getLastName()); user.setPassword(passwordEncoder.encode(accountDto.getPassword())); user.setEmail(accountDto.getEmail()); user.setRole(new Role(Integer.valueOf(1), user)); return repository.save(user); }
4、在认证时编码密码
现在让我们来处理这个流程的另一半,在用户认证时对密码进行编码。
首先,我们需要将之前定义的密码编码器 bean 注入到身份验证提供器中:
@Autowired private UserDetailsService userDetailsService; @Bean public DaoAuthenticationProvider authProvider() { DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); authProvider.setUserDetailsService(userDetailsService); authProvider.setPasswordEncoder(encoder()); return authProvider; }
security 配置很简单:
- 注入 UserDetailsService 实现类
- 定义一个认证提供器,引用了 UserDetailsService
- 启用了密码编码器
最后,我们需要在 security XML 配置中引用这个认证提供器:
<authentication-manager> <authentication-provider ref="authProvider" /> </authentication-manager>
或者,您也可以使用 Java 配置:
@Configuration @ComponentScan(basePackages = { "org.baeldung.security" }) @EnableWebSecurity public class SecSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(authProvider()); } ... }
5、结论
本教程继上一篇的注册流程,通过利用简单却非常强大的 BCrypt 实现展示了如何正确地存储密码到数据库中。
该注册流程在 Spring Security 教程中已经完全实现,您可以在 GitHub 项目中找到 — 这是一个 Eclipse 项目,应该很容易导入和运行。
以上所述就是小编给大家介绍的《[译] 学习 Spring Security(六):密码编码》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 挖洞经验 | 静态分析APK文件发现APP应用硬编码密码泄露
- 编码、摘要和加密(一)——字节编码
- 新媒体编码时代的技术:编码与传输
- MySQL数据库字符编码总结--数据传输编码
- Mysql用户忘记密码及密码过期问题的处理方法
- PHP 开发者学 Golang 之 URL 编码 (Urlencode)、解编码 (Urldecode)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
大数据技术原理与应用
林子雨 / 人民邮电出版社 / 2015-8-1 / 45.00
大数据作为继云计算、物联网之后IT行业又一颠覆性的技术,备受关注。大数据处不在,包括金融、汽车、零售、餐饮、电信、能源、政务、医疗、体育、娱乐等在内的社会各行各业,都融入了大数据的印迹,大数据对人类的社会生产和生活必将产生重大而深远的影响。 大数据时代的到来,迫切需要高校及时建立大数据技术课程体系,为社会培养和输送一大批具备大数据专业素养的高级人才,满足社会对大数据人才日益旺盛的需求。本书定......一起来看看 《大数据技术原理与应用》 这本书的介绍吧!