Проверка пароля - добавление дополнительных требований - PullRequest
1 голос
/ 01 апреля 2012

У меня есть код, который в настоящее время проверяет минимальную и максимальную длину. Я также хочу использовать прописные, строчные, специальные символы и цифры. Любые предложения о том, что добавить к этому или где я могу найти некоторые примеры? Я гуглял и просматривал этот форум, пытался добавить дополнительные требования к паролю и потерпел неудачу.

Это то, что я хочу требовать.

Не менее восьми символов в длину Не более 20 символов как минимум строчная буква и одна заглавная хотя бы один специальный символ из:! @ # $% ^ & * () ~ `- = _ + [] {} |:"; ',. / <>? хотя бы один символ [0-9] Невозможно сопоставить имя для входа в учетную запись или адрес электронной почты

Мой текущий код подтверждения пароля

public static final int MIN_PASSWORD_LENGTH = 8;
public static final int MAX_PASSWORD_LENGTH = 20;

public static boolean isAcceptablePassword(String password)
{
    if(TextUtils.isEmpty(password))
        return false;

    int len = password.length();

    if(len < MIN_PASSWORD_LENGTH || len > MAX_PASSWORD_LENGTH)
        return false;

    for(int i = 0; i < len; i++)
    {
        char c = password.charAt(i);
        if (Character.isWhitespace(c))
            return false;
    }

    return true;
}

Ответы [ 3 ]

4 голосов
/ 01 апреля 2012

Когда вы анализируете данные String, вы должны удалить пробелы справа и слева. Это делается с помощью функции Strimg#trim следующим образом:

password = password.trim();

Чтобы проанализировать каждый символ строки, вы можете преобразовать его в массив символов, чтобы вам было проще выполнить ваши требования:

char[] arrPassword = password.toCharArray();

Теперь вы можете оценить символ, используя следующие функции: Character#isUpperCase, Character#isLowerCase, Character#isDigit.

И последнее, но не менее важное: у вас может быть строка со специальными символами, которые необходимо проверить, и проверьте, находится ли фактический символ, который вы оцениваете, внутри этой строки. Это может быть достигнуто с помощью String#indexOf и String#valueOf, это последнее для преобразования символа в тип String.

Вот пример кода для всего этого объяснения:

public static final String SPECIAL_CHARACTERS = "!@#$%^&*()~`-=_+[]{}|:\";',./<>?";
public static final int MIN_PASSWORD_LENGTH = 8;
public static final int MAX_PASSWORD_LENGTH = 20;

public static boolean isAcceptablePassword(String password) {
    if (TextUtils.isEmpty(password)) {
        System.out.println("empty string.");
        return false;
    }
    password = password.trim();
    int len = password.length();
    if(len < MIN_PASSWORD_LENGTH || len > MAX_PASSWORD_LENGTH) {
        System.out.println("wrong size, it must have at least 8 characters and less than 20.");
        return false;
    }
    char[] aC = password.toCharArray();
    for(char c : aC) {
        if (Character.isUpperCase(c)) {
            System.out.println(c + " is uppercase.");
        } else
        if (Character.isLowerCase(c)) {
            System.out.println(c + " is lowercase.");
        } else
        if (Character.isDigit(c)) {
            System.out.println(c + " is digit.");
        } else
        if (SPECIAL_CHARACTERS.indexOf(String.valueOf(c)) >= 0) {
            System.out.println(c + " is valid symbol.");
        } else {
            System.out.println(c + " is an invalid character in the password.");
            return false;
        }
    }
    return true;
}

Предложение System.out.println(c + " is an invalid character in the password."); предназначено только для проверки результата анализа действительного символа.

2 голосов
/ 01 апреля 2012

Как насчет старых добрых регулярных выражений? Похоже, что это работает правильно, хотя, возможно, это ускользнуло при экранировании для специальной проверки символа

Pattern[] checks = {
        Pattern.compile("[!@#\\$%^&*()~`\\-=_+\\[\\]{}|:\\\";',\\./<>?]"),
        Pattern.compile("\\d+"), 
        Pattern.compile("[A-Z]+"),
        Pattern.compile("[a-z]+"), 
        Pattern.compile("^.{8,20}$") };

for (String test : new String[] { "password", "Password1",
        "Password1&", "toolongtoolongtoolong" }) {
    boolean ok = true;
    for (Pattern check : checks) {
        ok = ok && check.matcher(test).find();
    }
    System.out.println(test + " " + ok);
}
0 голосов
/ 01 апреля 2012

Стивен прав, если немного поискать, вы бы легко нашли здесь ответы.Но поток, на который ссылается Стивен, использует стороннюю библиотеку.

Если вы хотите реализовать это самостоятельно, то перед запуском цикла for инициализируйте 4 логических значения для ваших требований со значением false.Во время цикла проверяйте все четыре требования, пока одно из них не будет выполнено.Установите для соответствующего логического значения значение true.

Как проверить 4 требования:

После проверки цикладля 4 логических значений и реагировать соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...