😀

SpringBootパスワードの相関チェック

2021/12/11に公開

#はじめに
今回は、SpringBootを使った相関チェックの実装を行ったので、備忘録として書いておきます。

#環境

  • SpringBoot2.5.5
  • SpringSecurity
  • Thymeleaf
  • MyBatis2.2.0
  • MySQL5.6.50

#実現したいこと
僕の場合は、よくあるパスワードとパスワード(確認用)の2つが一致しないといけないというバリデーションを実現したいため、そのような実装を行いました。

参考文献にあるように、@AssertTrueを用いての実装を行い、上記仕様のバリデーションを実現しました。

#実装

import javax.validation.constraints.AssertTrue;

import lombok.Data;

@Data
public class SignupForm {

	private String password;
	
	private String passwordConfirmation;
	
	@AssertTrue(message = "PasswordとPassword confirmationは同一にしてください。")
	public boolean isPasswordValid() {
		if (password == null || password.isEmpty()) {
			return true;
		}
		
		return password.equals(passwordConfirmation);
	} 
}

@AssetTrueを用いると、相関チェックはラクに実装できます。これ以外の方法だと、自身でアノテーションを作成するなどがあります。

上記のコードを簡単に説明すると、パスワードの相関チェックは確認用の入力の際に行いたいので、if分の条件式でパスワードの入力欄がnullや空の時はバリデーションにかからないようにしています。

パスワードの入力がされた時は、パスワード(確認用)と等しいかを比較します。

#エラーメッセージの表示

    @PostMapping("/signup")
	public String postSignup(@Validated @ModelAttribute("form") SignupForm form, BindingResult result) {

		/* 入力チェック*/
		if (result.hasErrors()) {
			/* NG:ユーザー登録画面に戻る*/
			return "user/signup";
		}
        
        return "redirect:/";

}

まずはコントローラーですが、@Validatedアノテーションを使うことでバリデーションのチェックができます。
そして、BindingResultには、バリデーションの結果が格納されます。

そのため、if分の条件式では、「バリデーション結果がエラーの時」という条件を指定します。

<p th:if="${#fields.hasErrors('passwordValid')}" th:errors="*{passwordValid}"></p>

次にビューですが、相関チェックのメソッドisPasswordValidを変数化しpasswordValidとすることでメッセージの表示を行えます。

「どこからそんな変数が来たんや、、、」という方に向けて言うと、まず、コントローラーでバリデーション結果(BindingResult)を格納しているため、それをビューに渡せばメッセージは表示できます。

その時にformクラスに定義した相関チェックのメソッドも、当然渡されることになるので、ビューで呼び出す時に「is」を抜き、変数として扱うことでメッセージを表示しているという流れです。

#参考文献

Discussion