我对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()
,该方法现在已被弃用,如文档中所示:使用默认密码编码器()
不幸的是,我还没有找到一个替代方法,来完成这个教程,而不使用被弃用的方法。如果可能的话,有人能提供一个替代方法吗?
谢谢你!
***注意:***我附上了几张错误的屏幕截图以及我的gradle文件
3条答案
按热度按时间ar7v8xwq1#
编辑:删除了旧答案,误解了问题。下面是新答案:
User.withDefaultPasswordEncoder()
仍然可以用于演示,您不必担心这是否是您正在做的事情-即使它已被弃用-但在生产中,您不应该在源代码中使用纯文本密码。您应该执行following:而不是使用当前的
userDetailsService()
方法其中
ENCODED_PASSWORD
是用BCrypt编码的secret123
。你也可以用编程的方式编码,如下所示:passwordEncoder().encode("secret123")
.这样,即使您将代码推送到公共存储库,人们也不会知道密码,因为
ENCODED_PASSWORD
只显示编码后的(和散列)版本的密码,而不是纯文本版本的密码,但因为您知道$2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2
实际上是字符串secret123
的编码密码,而其他密码则不知道,具有凭据user:secret123
的内存中用户将不会受到威胁。请注意,为了便于示例,我使用了将其保留在静态变量中。
h5qlskok2#
使用passwordEncoder.encode()的过程如下
inkz8wg93#
在Spring Security 5.7.3中,WebSecurityConfigurerAdapter将被弃用,取而代之的是,我们必须提供UserDetailsService接口的Bean。
样本代码