Безопасность 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]()
Ответы
Ответ 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();
}
}