Java Spring Security-User.withDefaultPasswordEncoder()已被弃用?

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

我对JavaSpring安全性非常陌生,并且一直在关注spring.io。 作为其中的一部分,我根据需要编辑了
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();
   } 

}