Проверка паролей необходима практически всем приложениям сегодня. Существуют различные способы проверки паролей от написания всего вручную до использования сторонних API. В этом руководстве по проверке паролей мы создаем валидатор паролей с использованием регулярных выражений.
1. Регулярное выражение для проверки паролей
((?=.*[az])(?=.*d)(?=.*[@#$%])(?=.*[AZ]).{6,16})
Приведенное выше регулярное выражение состоит из следующих разделов:
(?=.*[a-z]) : This matches the presence of at least one lowercase letter.(?=.*d) : This matches the presence of at least one digit i.e. 0-9.(?=.*[@#$%]) : This matches the presence of at least one special character.((?=.*[A-Z]) : This matches the presence of at least one capital letter.{6,16} : This limits the length of password from minimum 6 letters to maximum 16 letters.Порядок верхних 4 секций может быть изменен или они могут быть даже исключены из окончательного регулярного выражения. Этот факт может быть использован для построения нашего валидатора паролей программным способом.
2. Программа Java для проверки паролей с использованием регулярных выражений
Мы делаем наш валидатор настраиваемым, чтобы можно было устанавливать ограничения в зависимости от потребностей. Например, если мы хотим принудительно ввести хотя бы один специальный символ, но не заглавную букву, мы можем передать требуемые аргументы соответствующим образом.
import java.util.regex.Matcher;import java.util.regex.Pattern;public class PasswordValidator {private static PasswordValidator INSTANCE = new PasswordValidator();private static String pattern = null;/*** No one can make a direct instance* */private PasswordValidator() {//do nothing}/*** Force the user to build a validator using this way only* */public static PasswordValidator buildValidator(boolean forceSpecialChar,boolean forceCapitalLetter,boolean forceNumber,int minLength,int maxLength) {StringBuilder patternBuilder = new StringBuilder("((?=.*[a-z])");if(forceSpecialChar) {patternBuilder.append("(?=.*[@#$%])");}if(forceCapitalLetter) {patternBuilder.append("(?=.*[A-Z])");}if(forceNumber) {patternBuilder.append("(?=.*d)");}patternBuilder.append(".{" + minLength + "," + maxLength + "})");pattern = patternBuilder.toString();return INSTANCE;}/*** Here we will validate the password* */public static boolean validatePassword(final String password) {Pattern p = Pattern.compile(pattern);Matcher m = p.matcher(password);return m.matches();}}3. Модульные тесты для проверки пароля
Итак, наш валидатор паролей готов. Давайте протестируем его с помощью нескольких тестовых случаев JUnit.
@SuppressWarnings("static-access")public class TestPasswordValidator{@Testpublic void testNormalPassword(){PasswordValidator validator = PasswordValidator.buildValidator(false, false, false, 6, 14);Assert.assertTrue(validator.validatePassword("howtodoinjava"));Assert.assertTrue(validator.validatePassword("howtodoin"));//Sort on lengthAssert.assertFalse(validator.validatePassword("howto"));}@Testpublic void testForceNumeric(){PasswordValidator validator = PasswordValidator.buildValidator(false,false, true, 6, 16);//Contains numericAssert.assertTrue(validator.validatePassword("howtodoinjava12"));Assert.assertTrue(validator.validatePassword("34howtodoinjava"));Assert.assertTrue(validator.validatePassword("howtodo56injava"));//No numericAssert.assertFalse(validator.validatePassword("howtodoinjava"));}@Testpublic void testForceCapitalLetter(){PasswordValidator validator = PasswordValidator.buildValidator(false,true, false, 6, 16);//Contains capitalsAssert.assertTrue(validator.validatePassword("howtodoinjavA"));Assert.assertTrue(validator.validatePassword("Howtodoinjava"));Assert.assertTrue(validator.validatePassword("howtodOInjava"));//No capital letterAssert.assertFalse(validator.validatePassword("howtodoinjava"));}@Testpublic void testForceSpecialCharacter(){PasswordValidator validator = PasswordValidator.buildValidator(true,false, false, 6, 16);//Contains special charAssert.assertTrue(validator.validatePassword("howtod@injava"));Assert.assertTrue(validator.validatePassword("@Howtodoinjava"));Assert.assertTrue(validator.validatePassword("howtodOInjava@"));//No special charAssert.assertFalse(validator.validatePassword("howtodoinjava"));}}В этой статье мы узнали о проверке паролей с помощью регулярных выражений Java, которые позволяют проверять буквенно-цифровые и специальные символы, включая максимальную и минимальную длину пароля.