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

我对java spring安全性非常陌生,并且遵循 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);
    }
}

在方法中,它使用现在已弃用的方法,如文档中所示:withDefaultPasswordEncoder()userDetailService()withDefaultPasswordEncoder()

不幸的是,我无法找到替代方法,以便在不使用已弃用的方法的情况下完成本教程。如果可能的话,有人能够为此提供替代方案吗?

谢谢!

注意:我已经附加了我的错误的几个屏幕截图,以及我的gradle文件

image 1: The error I am receiving

image 2: My gradle file


答案 1

编辑:删除了旧答案,误解了问题。这是新的:

User.withDefaultPasswordEncoder()仍然可以用于演示,如果这是你正在做的事情,你不必担心 - 即使它已被弃用 - 但在生产中,你不应该在源代码中有纯文本密码。

您应该执行以下操作而不是使用当前方法:userDetailsService()

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();
}

其中是用 BCrypt 编码的。您也可以以编程方式对其进行编码,如下所示:.ENCODED_PASSWORDsecret123passwordEncoder().encode("secret123")

这样,即使您将代码推送到公共存储库,人们也不会知道密码,因为只显示密码的编码版本而不是纯文本版本,但是因为您知道这实际上是字符串的编码密码,而其他人则不知道,因此具有凭据的内存中用户不会受到损害。ENCODED_PASSWORD$2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2secret123user:secret123

请注意,为了这个例子,我使用将其保留在静态变量中。


答案 2

使用密码Encoder.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();
   } 

}

推荐