SpringBoot 2.0.1.RELEASE中的AuthenticationManagerBuilder

时间:2018-04-10 13:50:57

标签: spring spring-mvc spring-boot spring-security password-encryption

我有一个SpringBoot 2.0.1.RELEASE mvc应用程序,所以在安全配置中我定义了这个方法:

@Autowired
 public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth
                    .inMemoryAuthentication()
                    .withUser(User
                            .withDefaultPasswordEncoder()
                            .username(DEV_USER)
                            .password(DEV_PWD)
                            .roles("ADMIN").build());
        }

但似乎不推荐使用User类型的方法withDefaultPasswordEncoder(),但我不知道我必须使用哪种方法,

1 个答案:

答案 0 :(得分:2)

来自Spring Framework Doc

@Deprecated
public static User.UserBuilder withDefaultPasswordEncoder()
  

已过时。使用这种方法对生产来说不安全,   但是可以接受演示和入门。用于生产   目的,确保密码在外部编码。看方法   Javadoc了解更多详情。

     

警告:此方法被认为对生产不安全,仅适用于此类方法   用于样品应用。

UserDetails user = User.withDefaultPasswordEncoder()
     .username("user")
     .password("password")
     .roles("USER")
     .build();
 // outputs {bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
 System.out.println(user.getPassword());
  

这对于生产来说是不安全的(它是用于入门的   经验)因为密码“密码”被编译成了   源代码然后在创建时包含在内存中。   这意味着仍有办法恢复纯文本密码   使它不安全。它确实提供了使用普通的轻微改进   文本密码,因为UserDetails密码是安全散列的。这个   表示如果UserDetails密码被意外暴露,则表示   密码已安全存储。在生产环境中,它是   建议提前哈希密码。例如:

PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
 // outputs {bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
 // remember the password that is printed out and use in the next step
 System.out.println(encoder.encode("password"));



UserDetails user = User.withUsername("user")
     .password("{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG")
     .roles("USER")
     .build();

返回:     UserBuilder,使用默认的PasswordEncoder

自动编码密码

要回答您的问题,您可以:

public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
        UserDetails userDetails = User.withUsername(DEV_USER)
                 .password(encoder.encode(DEV_PWD))
                 .roles("ADMIN")
                 .build();
        auth.inMemoryAuthentication().withUser(userDetails);
    }