我是java spring security的新手,并且正在关注Spring.io tutorial guide。
作为其中的一部分,我根据需要编辑了WebSecurityConfig
课程:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Bean
@Override
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
在userDetailService()
方法中,它使用的withDefaultPasswordEncoder()
现已弃用,如文档中所示:withDefaultPasswordEncoder()
不幸的是,我没有找到替代方法,在不使用弃用方法的情况下完成本教程。 如果可能,有人能为此提供替代方案吗?
谢谢!
注意: 我附上了几个错误的屏幕截图,以及我的gradle文件
答案 0 :(得分:18)
编辑:删除旧答案,误解了问题。这是新的:
User.withDefaultPasswordEncoder()
仍然可以用于演示,你不必担心这是你正在做什么 - 即使它已被弃用 - 但在生产中,你不应该有一个纯文本密码源代码。
您应该做的不是使用当前的userDetailsService()
方法following:
private static final String ENCODED_PASSWORD = "$2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2";
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.passwordEncoder(passwordEncoder())
.withUser("user").password(ENCODED_PASSWORD).roles("USER");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
其中ENCODED_PASSWORD
是secret123
编码的BCrypt。您也可以通过编程方式对其进行编码,如下所示:passwordEncoder().encode("secret123")
。
这样,即使您将代码推送到公共存储库,人们也不会知道密码,因为ENCODED_PASSWORD
只显示密码的编码版本而不是纯文本版本,但是因为您知道$2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2
实际上是字符串secret123
的编码密码,而其他人没有,您的凭据user:secret123
的内存用户不会受到损害。
请注意,为了示例,我正在使用静态变量。
答案 1 :(得分:0)
使用passwordEncoder.encode()就像这样
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.passwordEncoder(passwordEncoder())
.withUser("user")
.password(passwordEncoder().encode("miClave"))
.roles("USER");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}