Given a password, I am trying to validate if it passes all validation rules such as
- Be at least 6 characters long
- Contain at least one letter (a-z or A-Z)
- Contain at least one number (0-9)
- Contain at least one special character (@, $, %, etc)
So I am creating a common validation class which can be used for in any of my applications. Below are the following scenarios the validation class needs to handle :
- Passing password, confirm password as input and perform all validations.
- Passing current password, new password, confirm password as input and perform all validations.
- Passing username, password, confirm password as input but skip special character validation
So here is my initial idea. I created static methods for each scenario and return a Result object which will say if the validation has passed or failed. If it failed, it will contain error codes added to errors list object which the calling application will handle as needed.
/* 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");
}
}
The above flow might work for the required scenarios but is there a better way this can be implemented?
username
in method #3?