web-dev-qa-db-fra.com

Java Spring Security - User.withDefaultPasswordEncoder () est déconseillé?

Je suis très nouveau à Java sécurité du printemps, et suivais le Spring.io guide du tutoriel . Dans ce cadre, j'ai édité la classe WebSecurityConfig comme demandé:

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

Dans la méthode userDetailService(), il utilise withDefaultPasswordEncoder() qui est maintenant obsolète comme vu dans les documents: withDefaultPasswordEncoder ()

Malheureusement, je n'ai pas pu trouver d'alternative à cela, pour terminer ce tutoriel sans utiliser la méthode obsolète. Est-ce que quelqu'un serait en mesure de fournir une alternative pour cela si possible?

Merci!

note: J'ai joint quelques captures d'écran de mon erreur, ainsi que mon fichier gradle

image 1: The error I am receiving

image 2: My gradle file

13
sammyjjohnson71

EDIT: suppression de l'ancienne réponse, mauvaise compréhension de la question. Voici le nouveau:

User.withDefaultPasswordEncoder() peut toujours être utilisé pour les démos, vous n'avez pas à vous inquiéter si c'est ce que vous faites - même s'il est obsolète - mais en production, vous ne devriez pas avoir un mot de passe en texte brut dans votre source code.

Ce que vous devriez faire au lieu d'utiliser votre méthode userDetailsService() actuelle est la suivante :

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 Est secret123 Encodé avec BCrypt. Vous pouvez également le coder par programme comme ceci: passwordEncoder().encode("secret123").

De cette façon, même si vous transmettez votre code à un référentiel public, les gens ne connaîtront pas le mot de passe car ENCODED_PASSWORD N'affiche que la version codée du mot de passe et non la version en texte brut, mais parce que vous savez que $2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2 Est en fait le mot de passe codé de la chaîne secret123 Tandis que d'autres ne le font pas, votre utilisateur en mémoire avec les informations d'identification user:secret123 Ne sera pas compromis.

Notez que j'utilise le laisser dans une variable statique pour les besoins de l'exemple.

23
TwiN

Utiliser le mot de passeEncoder.encode () serait comme ça

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

}
0
martosfre