1. 概要

この記事では、登録プロセスの重要な部分であるパスワードエンコーディングについて説明します。基本的には、パスワードをプレーンテキストで保存しません。

Springセキュリティでサポートされているエンコーディングメカニズムはいくつかあります。この記事では、 BCrypt を使用します。これは、通常、利用可能な最良のソリューションであるためです。

MD5PasswordEncoderShaPasswordEncoderなどの他のメカニズムのほとんどは、より弱いアルゴリズムを使用しているため、現在は非推奨になっています。

2. パスワードエンコーダーを定義する

まず、構成で単純なBCryptPasswordEncoderをbeanとして定義します。

@Bean
public PasswordEncoder encoder() {
    return new BCryptPasswordEncoder();
}

SHAPasswordEncoder などの古い実装では、パスワードをエンコードするときにクライアントがソルト値を渡す必要があります。

ただし、BCryptは、代わりにが内部でランダムソルトを生成します。 これは、呼び出しごとに結果が異なることを意味するため、理解することが重要です。したがって、パスワードをエンコードする必要があるのは1回だけです。

このランダムなソルト生成を機能させるために、BCryptはハッシュ値自体の中にソルトを保存します。 たとえば、次のハッシュ値では次のようになります。

$2a$10$ZLhnHxdpHETcxmtEStgpI./Ri1mksgJ9iDP36FmfMdYyVg9g0b2dq

$で区切られた3つのフィールドがあります。

  1. 「2a」はBCryptアルゴリズムバージョンを表します
  2. 「10」はアルゴリズムの強さを表します
  3. 「ZLhnHxdpHETcxmtEStgpI」。 partは、実際にはランダムに生成されたソルトです。 基本的に、最初の22文字はソルトです。 最後のフィールドの残りの部分は、プレーンテキストの実際のハッシュバージョンです。

また、 BCrypt アルゴリズムは長さ60の文字列を生成するため、パスワードがそれに対応できる列に格納されることを確認する必要があることに注意してください。 よくある間違いは、異なる長さの列を作成し、認証時に無効なユーザー名またはパスワードエラーが発生することです。

3. 登録時にパスワードをエンコードする

ここで、UserServicePasswordEncoderを使用して、ユーザー登録プロセス中にパスワードをハッシュします。

例3.1。 – UserServic eはパスワードをハッシュします

@Autowired
private PasswordEncoder passwordEncoder;

@Override
public User registerNewUserAccount(UserDto accountDto) throws EmailExistsException {
    if (emailExist(accountDto.getEmail())) {
        throw new EmailExistsException(
          "There is an account with that email adress:" + accountDto.getEmail());
    }
    User user = new User();
    user.setFirstName(accountDto.getFirstName());
    user.setLastName(accountDto.getLastName());
    
    user.setPassword(passwordEncoder.encode(accountDto.getPassword()));
    
    user.setEmail(accountDto.getEmail());
    user.setRole(new Role(Integer.valueOf(1), user));
    return repository.save(user);
}

4. 認証時にパスワードをエンコードする

このプロセスの残りの半分を処理し、ユーザーが認証するときにパスワードをエンコードしてみましょう。

まず、前に定義したパスワードエンコーダーBeanを認証プロバイダーに挿入する必要があります。

@Autowired
private UserDetailsService userDetailsService;

@Bean
public DaoAuthenticationProvider authProvider() {
    DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
    authProvider.setUserDetailsService(userDetailsService);
    authProvider.setPasswordEncoder(encoder());
    return authProvider;
}

セキュリティ構成は単純です。

  • ユーザー詳細サービスの実装を注入しています
  • 詳細サービスを参照する認証プロバイダーを定義しています
  • パスワードエンコーダーも有効にしています

最後に、セキュリティXML構成でこの認証プロバイダー参照する必要があります。

<authentication-manager>
    <authentication-provider ref="authProvider" />
</authentication-manager>

または、Java構成を使用している場合:

@Configuration
@ComponentScan(basePackages = { "com.baeldung.security" })
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authProvider());
    }
    
    ...
}

5. 結論

このクイックチュートリアルは、シンプルでありながら非常に強力なBCrypt実装を活用して、データベースにパスワードを適切に保存する方法を示すことにより、登録シリーズを継続します。

このRegistrationwithSpring Securityチュートリアルの完全な実装は、GitHubにあります。