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);
}
}
}
}