Я пытаюсь добавить пользовательскую проверку пароля в поле пароля. Пароль должен содержать не менее 8 символов и соответствовать как минимум двум из указанных ниже критериев, но не должен соответствовать всем четырем:
- Имеет номера
- Имеет строчные буквы
- Имеет заглавные буквы
- Имеет специальные символы
У меня есть часть проверки работоспособности, но у меня возникла проблема, когда, если пароль имеет длину 8+ символов, но не соответствует хотя бы двум из указанных выше критериев, сообщение об ошибке будет не показать , Ошибка в отношении символов будет отображаться только в том случае, если пароль меньше 8 символов.
Я провел поиск в SO и не смог реализовать ответы на подобные вопросы. Я подозреваю, что проблема, связанная с моей пользовательской функцией проверки, не связана с паролем в ngModel.
Вопрос: Как получить сообщение об ошибке, отображаемое в поле формы, если пароль имеет длину более 8 символов, но НЕ соответствует приведенным выше требованиям к символам?
Вот соответствующий код.
С user-form.html :
<mat-form-field *ngIf="newPassword" fxFlex="100%">
<input matInput #password="ngModel" placeholder="Password" type="password" autocomplete="password"
[(ngModel)]="model.password" name="password" minlength="8" (keyup)="validatePassword(model.password)" required>
<mat-error *ngIf="invalidPassword">
Password must contain at least two of the following: numbers, lowercase letters, uppercase letters, or special characters.
</mat-error>
<mat-error *ngIf="password.invalid && (password.dirty || password.touched)">
<div *ngIf="password.errors.required">
Password is required
</div>
<div *ngIf="password.errors.minlength">
Password must be at least 8 characters
</div>
</mat-error>
</mat-form-field>
С user-form.component.ts :
export class UserFormComponent implements OnInit {
@Input()
user: User;
public model: any;
public invalidPassword: boolean;
constructor() {}
ngOnInit() {
this.model = this.user;
}
passwordFails(checks: boolean[]): boolean {
let counter = 0;
for (let i = 0; i < checks.length; i++) {
if (checks[i]) {
counter += 1;
}
}
return counter < 2;
}
validatePassword(password: string) {
let hasLower = false;
let hasUpper = false;
let hasNum = false;
let hasSpecial = false;
const lowercaseRegex = new RegExp("(?=.*[a-z])");// has at least one lower case letter
if (lowercaseRegex.test(password)) {
hasLower = true;
}
const uppercaseRegex = new RegExp("(?=.*[A-Z])"); //has at least one upper case letter
if (uppercaseRegex.test(password)) {
hasUpper = true;
}
const numRegex = new RegExp("(?=.*\\d)"); // has at least one number
if (numRegex.test(password)) {
hasNum = true;
}
const specialcharRegex = new RegExp("[!@#$%^&*(),.?\":{}|<>]");
if (specialcharRegex.test(password)) {
hasSpecial = true;
}
this.invalidPassword = this.passwordFails([hasLower, hasUpper, hasNum, hasSpecial]);
}
}