代码之家  ›  专栏  ›  技术社区  ›  Web User

基于Java的Regex for Azure AD cloud用户帐户密码策略

  •  1
  • Web User  · 技术社区  · 6 年前

    Azure AD cloud user account policy 在Java中使用regex。

    我定义了一个模式字符串 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);
    }
    

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

    我见过关于正则表达式问题的非常优雅的答案,但一般来说,它们不涉及字符类组合。希望有人能告诉我我做错了什么,或者有没有更好的方法。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Wiktor Stribiżew    6 年前

    您需要指定最后一部分中允许的字符,而不是点。替换 .{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 demo .

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