[译] 学习 Spring Security(六):密码编码

栏目: Java · 发布时间: 6年前

内容简介:[译] 学习 Spring Security(六):密码编码

本文将讨论注册流程中的一个关键部分 — 密码编码 (以非明文方式存储密码)。

Spring Security 支持一部分编码机制 — 本文将使用 BCrypt 编码方式,因为它通常被作为最佳的解决方案。

大多数其他机制,如 MD5PasswordEncoderShaPasswordEncoder 使用了较弱算法的编码方式,现在已被弃用了。

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(六):密码编码》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

增长黑客

增长黑客

范冰 / 电子工业出版社 / 2015-7-1 / CNY 59.00

“增长黑客”这一概念近年来兴起于美国互联网创业圈,最早是由互联网创业者Sean Ellis提出。增长黑客是介于技术和市场之间的新型团队角色,主要依靠技术和数据的力量来达成各种营销目标,而非传统意义上靠砸钱来获取用户的市场推广角色。他们能从单线思维者时常忽略的角度和难以企及的高度通盘考虑影响产品发展的因素,提出基于产品本身的改造和开发策略,以切实的依据、低廉的成本、可控的风险来达成用户增长、活跃度上......一起来看看 《增长黑客》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码