Password validate 8 digits, contains upper,lowerCa

2019-04-15 17:17发布

问题:

So I wrote a method that makes the user enter a password and this password must pass the following specs:

1. Be at least 8 digits long

2. Have an uppercase

3. Have a lowercase

4. Have special digit

I'm not sure as to why when I input it, the output doesn't account for the special Character and throws an error.

Here is my code so far:

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    System.out.print("Please enter a given  password : ");
    String passwordhere = in.nextLine();
    System.out.print("Please re-enter the password to confirm : ");
    String confirmhere = in.nextLine();
    System.out.println("your password is: " + passwordhere);

    while (!passwordhere.equals(confirmhere) || !isValid(passwordhere)) {
        System.out.println("The password entered here  is invalid");
        System.out.print("Please enter the password again.it must be valid : ");
        String Passwordhere = in.nextLine();
        System.out.print("Please re-enter the password to confirm : ");

    }
}

public static boolean isValid(String passwordhere) {

    if (passwordhere.length() < 8) {
        return false;
    } else {

        for (int p = 0; p < passwordhere.length(); p++) {
            if (Character.isUpperCase(passwordhere.charAt(p))) {
            }
        }
        for (int q = 0; q < passwordhere.length(); q++) {
            if (Character.isLowerCase(passwordhere.charAt(q))) {
            }
        }
        for (int r = 0; r < passwordhere.length(); r++) {
            if (Character.isDigit(passwordhere.charAt(r))) {
            }
        }
        for (int s = 0; s < passwordhere.length(); s++) {
            if (Character.isSpecialCharacter(passwordhere.charAt(s))) {
            } 
            }
            return true;
        }
}

Also, another problem is for example, lets say the user enter bob123 as their password.

How can I get the loop to tell the user what It needs to be a correct password?

On the example above it is missing a Capital Letter and a symbol(*&^..etc).

How can I add this to print out each time the user makes a password and until they get the right password to pass all specs of the code?

回答1:

You should have clearly mention your requirement I was not aware of your requirement. Please find my below solution`

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    System.out.print("Please enter a given  password : ");
    String passwordhere = in.nextLine();
    System.out.print("Please re-enter the password to confirm : ");
    String confirmhere = in.nextLine();

    List<String> errorList = new ArrayList<String>();

    while (!isValid(passwordhere, confirmhere, errorList)) {
        System.out.println("The password entered here  is invalid");
        for (String error : errorList) {
            System.out.println(error);
        }

        System.out.print("Please enter a given  password : ");
        passwordhere = in.nextLine();
        System.out.print("Please re-enter the password to confirm : ");
        confirmhere = in.nextLine();
    }
    System.out.println("your password is: " + passwordhere);

}

public static boolean isValid(String passwordhere, String confirmhere, List<String> errorList) {

    Pattern specailCharPatten = Pattern.compile("[^a-z0-9 ]", Pattern.CASE_INSENSITIVE);
    Pattern UpperCasePatten = Pattern.compile("[A-Z ]");
    Pattern lowerCasePatten = Pattern.compile("[a-z ]");
    Pattern digitCasePatten = Pattern.compile("[0-9 ]");
    errorList.clear();

    boolean flag=true;

    if (!passwordhere.equals(confirmhere)) {
        errorList.add("password and confirm password does not match");
        flag=false;
    }
    if (passwordhere.length() < 8) {
        errorList.add("Password lenght must have alleast 8 character !!");
        flag=false;
    }
    if (!specailCharPatten.matcher(passwordhere).find()) {
        errorList.add("Password must have atleast one specail character !!");
        flag=false;
    }
    if (!UpperCasePatten.matcher(passwordhere).find()) {
        errorList.add("Password must have atleast one uppercase character !!");
        flag=false;
    }
    if (!lowerCasePatten.matcher(passwordhere).find()) {
        errorList.add("Password must have atleast one lowercase character !!");
        flag=false;
    }
    if (!digitCasePatten.matcher(passwordhere).find()) {
        errorList.add("Password must have atleast one digit character !!");
        flag=false;
    }

    return flag;

}


回答2:

I'm not sure as to why when I output it the output doesn't account for the special Character and throws an error.

Hint: take a look at this fragment:

    for (int p = 0; p < passwordhere.length(); p++) {
        if (Character.isUpperCase(passwordhere.charAt(p))) {
        }
    }

What does it DO when it sees an uppercase character?

Hint 2: I think you need to count the characters in the various character classes and then ....

How can I get the loop to tell the user what It needs to be a correct password? for the example above it is missing a Capital letter and a symbol(*&^..etc)

Hint: your isValid method needs to "tell" someone or something why the password is invalid. Think about how it could do that. (Hint 2: I can think of three different ways to do it: exception, return value, print)



回答3:

Use this bean validation library for password validation:

https://github.com/ankurpathak/password-validation https://mvnrepository.com/artifact/com.github.ankurpathak.password/password-validation

It provides many constraint to deal with password validation and many more will be added in near future:

  1. ContainDigit: To validate if password contain specified number of digits.
  2. ContainLowercase: To validate if password contain specified number of lowercase.
  3. ContainSpecial: To validate if password contain specified number of special symbols.
  4. ContainUppercase: To validate if password contain specified number of uppercase.
  5. NotContainWhitespace: To validate should not have any whitespace.
  6. PasswordMatches: To validate if password and confirm password are equal. You can move also move constraint to confirm password field by using flag showErrorOnConfirmPassword (default is true).

All the constraints by default ignore blank so that it will be reported separately by NotBlank standard bean validation constraint and same can we turned of using ignoreBlank(true by default) flag of each constraint.

Small example to use the library is:


    @PasswordMatches
    public class PasswordDto {
     @Size(min = 8, max = 30)
     @NotContainWhitespace
     @ContainSpecial
     @ContainDigit
     private String password;
     @NotBlank
     private String confirmPassword;
    }



回答4:

Hi Please check below code it may help you

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    System.out.print("Please enter a given  password : ");
    String passwordhere = in.nextLine();
    System.out.print("Please re-enter the password to confirm : ");
    String confirmhere = in.nextLine();
    System.out.println("your password is: " + passwordhere);
    List<String> errorList=isValid(passwordhere,confirmhere);
    while (!errorList.isEmpty()) {
        System.out.println("The password entered here  is invalid");
        for(String error : errorList){
            System.out.println(error);
        }
        String Passwordhere = in.nextLine();
        System.out.print("Please re-enter the password to confirm : ");

    }

}

public static List<String> isValid(String passwordhere, String confirmhere) {

    List<String> errorList = new ArrayList<String>();

    Pattern specailCharPatten = Pattern.compile("[^a-z0-9 ]", Pattern.CASE_INSENSITIVE);
    Pattern UpperCasePatten = Pattern.compile("[A-Z ]");
    Pattern lowerCasePatten = Pattern.compile("[a-z ]");
    Pattern digitCasePatten = Pattern.compile("[0-9 ]");

    if (!passwordhere.equals(confirmhere)) {
        errorList.add("password and confirm password does not match");
    }
    if (passwordhere.length() <= 8) {
        errorList.add("Password lenght must have alleast 8 character !!");
    }
    if (!specailCharPatten.matcher(passwordhere).find()) {
        errorList.add("Password must have atleast one specail character !!");
    }
    if (!UpperCasePatten.matcher(passwordhere).find()) {
        errorList.add("Password must have atleast one uppercase character !!");
    }
    if (!lowerCasePatten.matcher(passwordhere).find()) {
        errorList.add("Password must have atleast one lowercase character !!");
    }
    if (!digitCasePatten.matcher(passwordhere).find()) {
        errorList.add("Password must have atleast one digit character !!");
    }

    return errorList;

}