Java Spring Security-User.withDefaultPasswordEncoder()已被弃用?
我对JavaSpring安全性非常陌生,并且一直在关注spring.io。 作为其中的一部分,我根据需要编辑了Java Spring Security-User.withDefaultPasswordEncoder()已被弃用?,java,spring,spring-mvc,spring-boot,spring-security,Java,Spring,Spring Mvc,Spring Boot,Spring Security,我对JavaSpring安全性非常陌生,并且一直在关注spring.io。 作为其中的一部分,我根据需要编辑了WebSecurityConfig类: @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Ex
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文件
编辑:删除旧答案,误解问题。这是新的:
User.withDefaultPasswordEncoder()
仍然可以用于演示,您不必担心这是否就是您正在做的事情—即使它已被弃用—但在生产环境中,您不应该在源代码中使用纯文本密码
不使用当前的userDetailsService()
方法,您应该做的是:
其中,ENCODED\u密码
是用BCrypt编码的secret123
。您还可以像这样通过编程对其进行编码:passwordEncoder().encode(“secret123”)
这样,即使您将代码推送到公共存储库,人们也不会知道密码,因为ENCODED\u password
只显示密码的编码版本,而不是纯文本版本,但是,因为您知道,$2a$10$aiuufk8g6efhbcumrv2l.aqnz3bjp7odqvfio5jjjmbfzq6x2/R/2实际上是字符串的编码密码secret123
,而其他人则不知道,所以您的内存中具有凭据的用户user:secret123
不会受到损害
请注意,为了示例的缘故,我使用将其保留在静态变量中。使用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();
}
}
你读了整个Javadoc吗?它涉及了大量的细节,特别是“对于演示和入门来说是可以接受的”。我确实这样做了,但是当我实现它(不只是拉回购协议)时,当我编写该方法时,我不断收到错误消息说withDefaultPasswordEncoder()无法解决,并且不让我运行程序。不推荐(您将得到警告)和未解决之间存在差异,这是一个错误。此文档仍在5.0文档中,因此不应消失;您使用的是哪个版本的Spring安全依赖项?使用gradle,我假设是5.0.4.RELEASE….->编译(“org.springframework.boot:springbootstartersecurity”)springboot1.5或2.0?您好,请快速询问关于passwordEncoder().encode(“secret123”)
的建议。你是这样说的,即使你把你的代码推到公共存储库,人们也不会知道密码,因为编码的密码只显示密码的编码版本,而不是纯文本版本,我很困惑,如果我使用passwordEncoder().encode(“secret123”)
并将其上传到存储库,人们不会看到我的密码吗?然而,如果我使用ENCODED\u PASSWORD
变量坚持使用您的原始代码,那么人们就不会看到我的原始密码。我不明白你那样说是什么意思,。。。thanx@Scaramouche无论密码是否经过编码/散列,在公共存储库中输入密码从来都不是一个好主意,但关键是,如果您不是在代码中编写passwordEncoder().encode(“secret123”)
,而是输入$2a$10$aiuufk8g6efhbcumrv2l.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2
,人们不会自动知道您的密码是secret123
,因为您只是按了哈希值,而不是实际的密码。我想说的是,您可以在本地运行System.out.println(passwordEncoder().encode(“secret123”)
,复制结果并将该结果用作密码。。。在你的代码中。但再一次,请记住,我要说的是,推送2a$10$aiuufk8g6efhbcumrv2l.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2比推送passwordEncoder().encode(“secret123”)
更安全,如果你想隐藏密码,但在未来,当有更好更快的计算机时,你的密码很可能被泄露。最好避免将任何密码/机密信息推送到公共存储库。相反,您应该使用环境变量。如何处理成功的身份验证?例如,我需要生成一个GWT令牌,然后返回并将其作为新的头添加到HTTP请求中。“有可能吗?”我跟着你走。但是,我不断收到“坏凭证”消息,显示用户名为“user”,密码为“secret123”。你能帮我解释一下为什么会出现这个错误吗?
@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();
}
}