在本快速教程中,我们将了解如何在注册期间实现和显示正确的密码约束。像这样的东西 – 密码应该包含一个特殊字符,或者它应该至少 8 个字符长。
我们希望能够使用强大的密码规则 - 但我们不想手动实际实现这些规则。因此,我们将充分利用成熟的Passay库。
首先,让我们创建一个自定义约束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;
现在 - 让我们使用该库创建一些强大的密码规则,而无需实际手动实现其中任何一个。
我们将创建密码验证器PasswordConstraintValidator,我们将定义密码的规则:
- public class PasswordConstraintValidator implements ConstraintValidator
{ -
- @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库的后代。
现在服务器端已经完成,让我们看一下客户端并使用JavaScript实现一个简单的“密码强度”功能。
我们将使用一个简单的jQuery插件 - 用于Twitter Bootstrap的jQuery密码强度计 - 来显示注册中的密码强度.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: '
', - wordNotEmail: '
', - wordSequences: '
', - wordLowercase: '
', - wordUppercase: '
', - wordOneNumber: '
', - wordOneSpecialChar: '
' - }
- }
- };
- $('#password').pwstrength(options);
- });
- </script>
就是这样 - 一种简单但非常有用的方法,可以在客户端显示密码的强度并在服务器端强制执行某些密码规则。
本教程的完整实现可以在github 项目中找到 – 这是一个基于 Eclipse 的项目,因此应该很容易导入和运行。