Основанная на Java политика паролей учетных записей пользователей облака Regex для Azure AD - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь реализовать политику учетных записей пользователей облачного Azure AD в Java с использованием регулярных выражений.

Я определил строку шаблона и использую string.matches (pattern) следующим образом:

// ONE OF THESE CHARACTER CLASS COMBINATIONS NEED TO BE MET
// combination of lowercase, uppercase and numbers, 8 to 16 characters in length
// combination of lowercase, uppercase and symbols, 8 to 16 characters in length
// combination of lowercase, numbers and symbols, 8 to 16 characters in length
// combination of uppercase, numbers and symbols 8 to 16 characters in length
private static final String PATTERN_PASSWORD_REGEX = new StringBuilder('^')
        .append("((?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])).{8,16}")
        .append('|') // -or-
        .append("((?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&*\\-_!+=\\[\\]{}|\\:‘,.?\\/`~“\\(\\);])).{8,16}")
        .append('|') // -or-
        .append("((?=.*[a-z])(?=.*[0-9])(?=.*[@#$%^&*\\-_!+=\\[\\]{}|\\:‘,.?\\/`~“\\(\\);])).{8,16}")
        .append('|') // -or-
        .append("((?=.*[A-Z])(?=.*[0-9])(?=.*[@#$%^&*\\-_!+=\\[\\]{}|\\:‘,.?\\/`~“\\(\\);])).{8,16}")
        .append('$')
        .toString();

public static boolean validate(String password) {
    return password.matches(PATTERN_PASSWORD_REGEX);
}

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

@Test
public void testPassword() {

    Assert.assertTrue("password is valid", validate("Abcdef12"));
    Assert.assertTrue("password is valid", validate("abcde$12"));
    Assert.assertTrue("password is valid", validate("ABCDE%12"));
    Assert.assertTrue("password is valid", validate("Abcde~12"));
    Assert.assertFalse("password is invalid", validate("abcdefgh"));
    Assert.assertFalse("password is invalid", validate("12345678"));
    Assert.assertFalse("password is invalid", validate("ABCDEFGH"));
    Assert.assertFalse("password is invalid", validate("ABCDefgh"));
    Assert.assertFalse("password is invalid", validate("!~$:-_@&"));

    // This assertion fails...
    Assert.assertFalse("password is invalid", validate("Abcdef 12"));
}

Я видел очень элегантные ответы на вопросы регулярных выражений о SO, но обычно они не включают комбинации классов символов. Надеюсь, кто-нибудь скажет мне, что я делаю неправильно, или если есть намного лучший способ сделать это.

1 Ответ

0 голосов
/ 01 сентября 2018

Вам нужно указать те символы, которые вы разрешаете в последней части, вместо точки. Заменить .{8,16} на [-A-Za-z0-9@#$%^&*_!+=\[\]{}|:',.?/`~\"();]{8,16}:

^(?:
 (?=.*[a-z])(?=.*[A-Z])(?=.*\d)
 |
 (?=.*[a-z])(?=.*[A-Z])(?=.*[-@#$%^&*_!+=\[\]{}|:',.?/`~"();])
 |
 (?=.*[a-z])(?=.*\d)(?=.*[-@#$%^&*_!+=\[\]{}|:',.?/`~"();])
 |
 (?=.*[A-Z])(?=.*\d)(?=.*[-@#$%^&*_!+=\[\]{}|:',.?/`~"();])
)
[-A-Za-z0-9@#$%^&*_!+=\[\]{}|:',.?/`~"();]{8,16}
$

См. Демоверсию regex .

private static final String PATTERN_PASSWORD_REGEX = new StringBuilder('^(?:')
    .append("(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])")
    .append('|') // -or-
    .append("(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=.*[-@#$%^&*_!+=\\[\\]{}|:‘,.?/`~“();])")
    .append('|') // -or-
    .append("(?=[^a-z]*[a-z])(?=[^0-9]*[0-9])(?=.*[-@#$%^&*_!+=\\[\\]{}|:‘,.?/`~“();])")
    .append('|') // -or-
    .append("(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])(?=.*[-@#$%^&*_!+=\\[\\]{}|:‘,.?/`~“();])")
    .append(')[-A-Za-z0-9@#$%^&*_!+=\\[\\]{}|:‘,.?/`~“();]{8,16}$')
    .toString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...