Creating your own password validator

You can create your own password validation. The new password validator class must implement the PasswordValidator interface:

public interface PasswordValidator {
  /**
   * Validate
   * 
   * @param password
   * @throws ValidatorException
   */
  public void Validate(String password) throws ValidatorException;
 
}

From password validator class you can use several configuration parameters:

  • Config.PROPERTY_VALIDATOR_PASSWORD to return value of parameter  "validator.password".
  • Config.PROPERTY_VALIDATOR_PASSWORD_MIN_LENGTH to return value of parameter  "validator.password.min.length".
  • Config.PROPERTY_VALIDATOR_PASSWORD_MAX_LENGTH to return value of parameter  "validator.password.max.length".
  • Config.PROPERTY_VALIDATOR_PASSWORD_MIN_LOWERCASE to return value of parameter  "validator.password.min.lowercase".
  • Config.PROPERTY_VALIDATOR_PASSWORD_MIN_UPPERCASE to return value of parameter  "validator.password.min.uppercase".
  • Config.PROPERTY_VALIDATOR_PASSWORD_MIN_DIGITS to return value of parameter  "validator.password.min.digits".
  • Config.PROPERTY_VALIDATOR_PASSWORD_MIN_SPECIAL to return value of parameter  "validator.password.mini.special".

More information at Password validation configuration.

Sample

CompletePasswordValidator class:

/**
 * Complex password validator
 */
public class CompletePasswordValidator implements PasswordValidator {
  @SuppressWarnings("unused")
  private static Logger log = LoggerFactory.getLogger(CompletePasswordValidator.class);
 
  @Override
  public void Validate(String password) throws ValidatorException {
    validateLength(password);
    checkLowerCase(password);
    checkUpperCase(password);
    checkDigits(password);
    checkSpecial(password);
  }
 
  /**
   * Validate length
   */
  private void validateLength(String password) throws ValidatorException {
    if (Config.VALIDATOR_PASSWORD_MIN_LENGTH > 0 && 
        password.length() < Config.VALIDATOR_PASSWORD_MIN_LENGTH) {
      throw new ValidatorException(Config.VALIDATOR_PASSWORD_ERROR_MIN_LENGTH); 
    }
 
    if (Config.VALIDATOR_PASSWORD_MAX_LENGTH > 0 && 
        password.length() > Config.VALIDATOR_PASSWORD_MAX_LENGTH) {
      throw new ValidatorException(Config.VALIDATOR_PASSWORD_ERROR_MAX_LENGTH); 
    }
  }
 
  /**
   * Validate lowercase characters
   */
  private void checkLowerCase(String password) throws ValidatorException {
    int count = 0;
 
    if (Config.VALIDATOR_PASSWORD_MIN_LOWERCASE > 0) {
      for (int i=0; i<password.length(); i++) {
        if (Character.isLowerCase(password.charAt(i))) {
          count ++;
        }
      }
 
      if (Config.VALIDATOR_PASSWORD_MIN_LOWERCASE > count) {
        throw new ValidatorException(Config.VALIDATOR_PASSWORD_ERROR_MIN_LOWERCASE); 
      }
    }
  }
 
  /**
   * Validate uppercase characters
   */
  private void checkUpperCase(String password) throws ValidatorException {
    int count = 0;
 
    if (Config.VALIDATOR_PASSWORD_MIN_UPPERCASE > 0) {
      for (int i=0; i<password.length(); i++) {
        if (Character.isUpperCase(password.charAt(i))) {
          count ++;
        }
      }
 
      if (Config.VALIDATOR_PASSWORD_MIN_UPPERCASE > count) {
        throw new ValidatorException(Config.VALIDATOR_PASSWORD_ERROR_MIN_UPPERCASE); 
      }
    }
  }
 
  /**
   * Validate digits
   */
  private void checkDigits(String password) throws ValidatorException {
    int count = 0;
 
    if (Config.VALIDATOR_PASSWORD_MIN_DIGITS > 0) {
      for (int i=0; i<password.length(); i++) {
        if (Character.isDigit(password.charAt(i))) {
          count ++;
        }
      }
 
      if (Config.VALIDATOR_PASSWORD_MIN_DIGITS > count) {
        throw new ValidatorException(Config.VALIDATOR_PASSWORD_ERROR_MIN_DIGITS); 
      }
    }
  }
 
  /**
   * Validate special characters
   */
  private void checkSpecial(String password) throws ValidatorException {
    int count = 0;
 
    if (Config.VALIDATOR_PASSWORD_MIN_SPECIAL > 0) {
      for (int i=0; i<password.length(); i++) {
        if (!Character.isLetterOrDigit(password.charAt(i)) &&
	    !Character.isWhitespace(password.charAt(i))) {
          count ++;
        }
      }
 
      if (Config.VALIDATOR_PASSWORD_MIN_SPECIAL > count) {
        throw new ValidatorException(Config.VALIDATOR_PASSWORD_ERROR_MIN_SPECIAL); 
      }
    }
  }
}