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?
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;
}
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)
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:
- ContainDigit: To validate if password contain specified number of digits.
- ContainLowercase: To validate if password contain specified number of lowercase.
- ContainSpecial: To validate if password contain specified number of special symbols.
- ContainUppercase: To validate if password contain specified number of uppercase.
- NotContainWhitespace: To validate should not have any whitespace.
- 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;
}
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;
}