Безопасность Java Spring - User.withDefaultPasswordEncoder() устарел? - программирование
Подтвердить что ты не робот

Безопасность Java Spring - User.withDefaultPasswordEncoder() устарел?

Я очень плохо знаком с Java Spring Security и следовал руководству 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() который теперь устарел, как видно из документации: withDefaultPasswordEncoder()

К сожалению, я не смог найти альтернативу этому, чтобы завершить этот урок без использования устаревшего метода. Может ли кто-нибудь предоставить альтернативу этому, если это возможно?

Спасибо!

примечание: я приложил пару снимков экрана с моей ошибкой, а также файл Gradle

image 1: The error I am receiving

image 2: My gradle file

4b9b3361

Ответ 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();
}

Где ENCODED_PASSWORD - это secret123 закодированный с помощью BCrypt. Вы также можете кодировать его программно следующим образом: passwordEncoder().encode("secret123").

Таким образом, даже если вы отправите свой код в общедоступный репозиторий, люди не будут знать пароль, потому что ENCODED_PASSWORD показывает только зашифрованную версию пароля, а не текстовую версию, а потому что вы знаете, что $2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2 на самом деле является зашифрованным паролем строки secret123 то время как другие этого не делают, ваш пользователь в памяти с пользователем учетных user:secret123 не будет взломан.

Обратите внимание, что для примера я оставляю его в статической переменной.

Ответ 2

Использование 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();
   } 

}