web-dev-qa-db-ja.com

Java Spring Security-User.withDefaultPasswordEncoder()は非推奨ですか?

私はJava spring securityであり、Spring.io tutorial guide に従いました。この一部として、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()

残念ながら、非推奨の方法を使用せずにこのチュートリアルを完了するために、これに代わるものを見つけることができませんでした。可能であれば誰かがこれに代わるものを提供できるでしょうか?

ありがとう!

note:私のエラーのスクリーンショットとグラドルファイルをいくつか添付しました

image 1: The error I am receiving

image 2: My gradle file

13
sammyjjohnson71

編集:古い回答を削除し、質問を誤解しました。ここに新しいものがあります:

User.withDefaultPasswordEncoder()はまだデモに使用できます。これが非推奨であっても、それが何をしているのかを心配する必要はありませんが、本番環境では、ソースにプレーンテキストのパスワードを使用しないでください。コード。

現在のuserDetailsService()メソッドを使用する代わりに行うべきことは、 following です。

_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_はBCryptでエンコードされた_secret123_です。 passwordEncoder().encode("secret123")のようにプログラムでエンコードすることもできます。

そうすれば、コードをパブリックリポジトリにプッシュしても、_ENCODED_PASSWORD_はパスワードのエンコードされたバージョンのみを表示し、プレーンテキストバージョンは表示しないため、パスワードはわかりませんが、_$2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2_は実際には文字列_secret123_のエンコードされたパスワードですが、他の人はそうではありませんが、資格情報_user:secret123_を持つメモリ内ユーザーは危険にさらされません。

例のために静的変数に残して使用していることに注意してください。

23
TwiN

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

}
0
martosfre