我有一个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()
,但我不知道我必须使用哪种方法,
答案 0 :(得分:2)
@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);
}