Creating your own password validator

You can create your own password validator.

Conditions:

  • The new password validator class must implement the "PasswordValidator" interface.
  • The new password validator class must be declared under the package "com.openkm.validator.password".

Password validator interface:

package com.openkm.validator.password;

import com.openkm.validator.ValidatorException;

public interface PasswordValidator {

    /**
     * Validate
     *
     * @param password
     * @throws ValidatorException
     */
    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:

package com.openkm.validator.password;

import com.openkm.core.Config;
import com.openkm.validator.ValidatorException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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