Data una password, sto provando a convalidare se passa tutte le regole di validazione come
- Sii lungo almeno 6 caratteri
- Contenere almeno una lettera (a-z o A-Z)
- Contiene almeno un numero (0-9)
- Contiene almeno un carattere speciale (@, $,%, ecc.)
Quindi sto creando una classe di convalida comune che può essere utilizzata in una qualsiasi delle mie applicazioni. Di seguito sono riportati i seguenti scenari che la classe di convalida deve gestire:
- Passare la password, confermare la password come input ed eseguire tutte le convalide.
- Passaggio della password corrente, nuova password, conferma password come input ed eseguire tutte le convalide.
- Passa nome utente, password, conferma password come input ma salta convalida caratteri speciali
Quindi ecco la mia idea iniziale. Ho creato metodi statici per ogni scenario e restituito un oggetto Result che dirà se la convalida ha superato o fallito. Se non è riuscito, conterrà i codici di errore aggiunti all'oggetto lista errori che l'applicazione chiamante gestirà come necessario.
/* CASE1: Passing password, confirm password as input and perform all validation */
public static ValidationResult validate(final String newPassword, final String newConfirmedPassword) {
ValidationResult result = checkPassword(null, newPassword, newConfirmedPassword, false, true);
// check for any errors in result object
return result;
}
/* CASE 2 : Passing current password, new password, confirm password as input and perform all validation */
public static ValidationResult validate(final String oldPassword, final String newPassword, final String newConfirmedPassword) {
ValidationResult result = checkPassword(oldPassword, newPassword, newConfirmedPassword, true, true);
// check for any errors in result object
return result;
}
/* CASE3: Passing username, password, confirm password as input but skip special character validation */
public static ValidationResult validate(final String userName, final String newPassword, final String newConfirmedPassword) {
ValidationResult result = checkPassword(oldPassword, newPassword, newConfirmedPassword, true, false);
// check for any errors in result object
return result;
}
private static ValidationResult checkPassword(final String currentPass, final String newPass,
final String confirmedPass, final boolean resetFlag, boolean allowSplChar) {
ValidationResult result = new ValidationResult(true);
if(resetFlag) {
//check if current password app has entered is correct
//check new password is different from current password
}
// check password length is between 8-14 characters
if (doesNotContainUpperCaseAlpha(newPass)){
// set error code to result
result.getErrors().add("ERROR_NO_UPPERCASE");
}
if (doesNotContainLowerCaseAlpha(newPass)){
// set error code to result
result.getErrors().add("ERROR_NO_LOWERCASE");
}
...
..
if(allowSplChar && doesNotContainSplCharacter(newPass)){
// set error code to result
result.getErrors().add("ERROR_NO_SPECIAL_CHARAACTER");
}
}
Il flusso sopra potrebbe funzionare per gli scenari richiesti, ma esiste un modo migliore per implementarlo?