SpringBootパスワードの相関チェック
#はじめに
今回は、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