登録–パスワード強度とルール
1. 概要
このクイックチュートリアルでは、登録中に適切なパスワード制約を実装して表示する方法を見ていきます。 たとえば、パスワードには特殊文字を含めるか、8文字以上にする必要があります。
強力なパスワードルールを使用できるようにしたいのですが、実際にはこれらのルールを手動で実装したくありません。 そこで、成熟したPassayライブラリをうまく活用します。
2. カスタムパスワードの制約
まず、カスタム制約ValidPasswordを作成しましょう。
@Documented
@Constraint(validatedBy = PasswordConstraintValidator.class)
@Target({ TYPE, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
public @interface ValidPassword {
String message() default "Invalid Password";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
そしてそれをUserDtoで使用します。
@ValidPassword
private String password;
3. カスタムパスワードバリデーター
では、ライブラリを使用して、実際に手動で実装しなくても、強力なパスワードルールを作成しましょう。
パスワードバリデーターPasswordConstraintValidatorを作成し、パスワードのルールを定義します。
public class PasswordConstraintValidator implements ConstraintValidator<ValidPassword, String> {
@Override
public void initialize(ValidPassword arg0) {
}
@Override
public boolean isValid(String password, ConstraintValidatorContext context) {
PasswordValidator validator = new PasswordValidator(Arrays.asList(
new LengthRule(8, 30),
new UppercaseCharacterRule(1),
new DigitCharacterRule(1),
new SpecialCharacterRule(1),
new NumericalSequenceRule(3,false),
new AlphabeticalSequenceRule(3,false),
new QwertySequenceRule(3,false),
new WhitespaceRule()));
RuleResult result = validator.validate(new PasswordData(password));
if (result.isValid()) {
return true;
}
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(
Joiner.on(",").join(validator.getMessages(result)))
.addConstraintViolation();
return false;
}
}
ここで新しい制約違反を作成し、パスワードが無効な場合に備えて、デフォルトの違反も無効にしていることに注意してください。
最後に、Passayライブラリもpomに追加しましょう。
<dependency>
<groupId>org.passay</groupId>
<artifactId>passay</artifactId>
<version>1.0</version>
</dependency>
少し歴史的な情報として、Passayは由緒ある vt-passwordJavaライブラリの子孫です。
4. JSパスワードメーター
サーバー側が完成したので、クライアント側を見て、JavaScriptを使用して単純な「パスワード強度」機能を実装しましょう。
単純なjQueryプラグイン– jQuery Password Strength Meter for Twitter Bootstrap –を使用して、registerration.htmlにパスワード強度を表示します。
<input id="password" name="password" type="password"/>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="pwstrength.js"></script>
<script type="text/javascript">
$(document).ready(function () {
options = {
common: {minChar:8},
ui: {
showVerdictsInsideProgressBar:true,
showErrors:true,
errorMessages:{
wordLength: '<spring:message code="error.wordLength"/>',
wordNotEmail: '<spring:message code="error.wordNotEmail"/>',
wordSequences: '<spring:message code="error.wordSequences"/>',
wordLowercase: '<spring:message code="error.wordLowercase"/>',
wordUppercase: '<spring:message code="error.wordUppercase"/>',
wordOneNumber: '<spring:message code="error.wordOneNumber"/>',
wordOneSpecialChar: '<spring:message code="error.wordOneSpecialChar"/>'
}
}
};
$('#password').pwstrength(options);
});
</script>
5. 結論
これで、クライアント側でパスワードの強度を示し、サーバー側で特定のパスワードルールを適用するためのシンプルですが非常に便利な方法です。
このチュートリアルの完全実装は、 githubプロジェクトにあります。これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。