Spring Securityへの登録 - パスワードの暗号化

Spring Securityへの登録-パスワードエンコーディング

1. 概要

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

Spring Securityでサポートされているエンコードメカニズムはいくつかあります。記事we’ll use BCryptについては、通常、利用可能な最良のソリューションであるためです。

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

参考文献:

Spring Security 5の新しいパスワードストレージ

Spring Security 5のパスワード暗号化を理解し、より優れた暗号化アルゴリズムに移行するためのクイックガイド。

Spring Securityを使用して、受け入れられた場所からの認証のみを許可する

Spring Securityでのみ、承認された場所からのみユーザーの認証を許可する方法を学びます。

Spring Security –登録後の自動ログインユーザー

ユーザーが登録プロセスを完了した後、ユーザーをすばやく自動認証する方法を学びます。

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

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

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

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

ただし、BCryptは代わりにwill internally generate a random saltです。 これは、各呼び出しの結果が異なることを意味するため、理解することが重要です。したがって、パスワードを1回だけエンコードする必要があります。

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

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

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

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

@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構成でreference this auth providerを実行する必要があります。


    

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

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

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

    ...
}

5. 結論

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

このSpringSecurityへの登録チュートリアルのfull implementationは、the GitHub projectにあります。これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。