zoukankan      html  css  js  c++  java
  • Spring Security 5中的默认密码编码器

    1.概述

    在Spring Security 4中,可以使用内存中身份验证以纯文本格式存储密码。

    对版本5中的密码管理过程进行了重大改进,为密码编码和解码引入了更安全的默认机制。这意味着如果您的Spring应用程序以纯文本格式存储密码,升级到Spring Security 5可能会导致问题

    在这个简短的教程中,我们将描述其中一个潜在的问题,并展示该问题的解决方案。

    2. Spring Security 4

    我们首先展示一个标准的安全配置,它提供简单的内存中身份验证(适用于Spring 4):

    @Configuration
    public class InMemoryAuthWebSecurityConfigurer 
      extends WebSecurityConfigurerAdapter {
     
        @Override
        protected void configure(AuthenticationManagerBuilder auth) 
          throws Exception {
            auth.inMemoryAuthentication()
              .withUser("spring")
              .password("secret")
              .roles("USER");
        }
     
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
              .antMatchers("/private/**")
              .authenticated()
              .antMatchers("/public/**")
              .permitAll()
              .and()
              .httpBasic();
        }
    }
    

    此配置定义所有/私有/映射方法的身份验证以及/ public /下所有内容的公共访问。

    如果我们在Spring Security 5下使用相同的配置,我们会收到以下错误:

    java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
    
    

    该错误告诉我们由于没有为我们的内存中身份验证配置密码编码器,因此无法解码给定的密码

    3. Spring Security 5

    我们可以通过使用PasswordEncoderFactories类定义DelegatingPasswordEncoder来解决此错误。

    我们使用此编码器通过AuthenticationManagerBuilder配置我们的用户:

    @Configuration
    public class InMemoryAuthWebSecurityConfigurer 
      extends WebSecurityConfigurerAdapter {
     
        @Override
        protected void configure(AuthenticationManagerBuilder auth) 
          throws Exception {
            PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
            auth.inMemoryAuthentication()
              .withUser("spring")
              .password(encoder.encode("secret"))
              .roles("USER");
        }
    }
    

    现在,通过这种配置,我们使用BCrypt以以下格式存储我们的内存中密码:

    {bcrypt}$2a$10$MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS
    
    

    虽然我们可以定义自己的一组密码编码器,但建议坚持使用PasswordEncoderFactories中提供的默认编码器

    3.1.迁移现有密码

    我们可以通过以下方式将现有密码更新为推荐的Spring Security 5标准:

    更新纯文本存储密码及其编码值:

    String encoded = new BCryptPasswordEncoder().encode(plainTextPassword);
    

    前缀散列存储的密码及其已知的编码器标识符:

    {bcrypt}$2a$10$MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS
    {sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0
    

    当存储密码的编码机制未知时,请求用户更新其密码

    4.结论

    在这个快速示例中,我们使用新的密码存储机制将有效的Spring 4内存中认证配置更新到Spring 5

    与往常一样,您可以在GitHub项目中找到源代

  • 相关阅读:
    前缀和问题
    AtCoder Beginner Contest 085(ABCD)
    73.链表的基本操作
    112、文本串的加密
    100.容器List-ArrayList
    GUI颜色、字体设置对话框
    (贪心)多机调度问题
    POJ-1700 Crossing River
    lower_bound() upper_bound()函数
    HDU 1141
  • 原文地址:https://www.cnblogs.com/xjknight/p/10929291.html
Copyright © 2011-2022 走看看