Ejercicio POO Java: Crear Clase Password

Crea una clase Password que tenga como atributo un String que representa una contraseña.

La clase Password contendrá los siguientes constructores:

  • Constructor por defecto que genera una contraseña de longitud 8.
  • Constructor con un parámetro de tipo int. Este parámetro indica la longitud de la contraseña que se va a crear.

Las contraseñas en ambos casos se generan al azar y contendrán letras mayúsculas, letras minúsculas, dígitos y los caracteres . (punto) y _ (guión bajo).

La clase Password contendrá un método llamado esFuerte() que comprueba si la contraseña es fuerte o no según estas normas:

  • La longitud es como mínimo de 8 caracteres.
  • Contiene como mínimo dos letras mayúsculas, dos letras minúsculas, un dígito y al menos un punto o un guión bajo.

El método esFuerte() devuelve un boolean indicando si la contraseña es fuerte o no.

La clase contendrá también un método modificarContraseña() para cambiar una contraseña ya existente. El método modificarContraseña() pide por teclado un String que contenga una nueva contraseña. Si la contraseña introducida es fuerte se modifica la contraseña actual. Si no es fuerte se deja la contraseña actual sin modificar. El método devuelve true si se ha modificado la contraseña y false en caso contrario.

El valor de una contraseña solo se podrá modificar mediante el método modificarContraseña().

Además de estos métodos puedes añadir a la clase los métodos que consideres necesarios.

Una vez creada la clase Password escribe un programa para probar el funcionamiento de la clase

Solución :

//Clase Password
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author enrique
 */
public class Password {

    private String contraseña;

    //Constructor por defecto
    //Crea una contraseña aleatoria de longitud 8
    //Para obtener la contraseña invoca al constructor con parámetros y le envía la longitud
    public Password() {
        this(8);
    }

    //Constructor con parámetros
    //Crea una contraseña aleatoria con una longitud que recibe como parámetro
    public Password(int longitud) {
        contraseña = generaPassword(longitud);
    }

    //Método get
    public String getContraseña() {
        return contraseña;
    }
    
    //Esta clase no tendrá método set para la contraseña. 
    //El valor de la contraseña solo se puede cambiar mediante el método modificarContraseña

    //Método que genera las contraseñas aleatorias
    //Se trata de un método privado para que no pueda ser invicado desde fuera de lal clase
    private String generaPassword(int longitud) {
        Random rnd = new Random();
        StringBuilder password = new StringBuilder();
        char caracter;
        int digito;
        for (int i = 0; i < longitud; i++) {
            //Se obtiene un número al azar del 0 al 4. 
            //Según este número se obtiene una mayúscula, minúscula, número, punto o guión bajo
            switch (rnd.nextInt(5)) {
                case 0:
                    caracter = (char) (rnd.nextInt('Z' - 'A' + 1) + 'A');//obtenemos una mayúscula al azar
                    password.append(caracter);
                    break;
                case 1:
                    caracter = (char) (rnd.nextInt('z' - 'a' + 1) + 'a'); //obtenemos una minúscula al azar       
                    password.append(caracter);
                    break;
                case 2:
                    digito = rnd.nextInt(10); //obtenemos un dígito del 0 al 9
                    password.append(digito);
                    break;
                case 3:
                    password.append('.'); //añadimos un punto
                    break;
                case 4:
                    password.append('_'); //añadimos un guión bajo
                    break;
            }
        }
        return password.toString();
    }

    //Método que comprueba si la contraseña es fuerte o no
    public boolean esFuerte() {
        int mayusculas = 0;
        int minusculas = 0;
        int digitos = 0;
        int puntos = 0;
        int guiones = 0;
        if (contraseña.length() < 8) {
            return false;
        }
        for (int i = 0; i < contraseña.length(); i++) {
            if (contraseña.charAt(i) >= 'a' && contraseña.charAt(i) <= 'z') {
                minusculas++;
            } else if (contraseña.charAt(i) >= 'A' && contraseña.charAt(i) <= 'Z') {
                mayusculas++;
            } else if (contraseña.charAt(i) >= '0' && contraseña.charAt(i) <= '9') {
                digitos++;
            } else if (contraseña.charAt(i) == '.') {
                puntos++;
            } else if (contraseña.charAt(i) == '_') {
                guiones++;
            }
        }

        if (mayusculas >= 2 && minusculas >= 2 && digitos >= 1 && puntos >= 1 && guiones >= 1) {
            return true;
        }
        return false;
    }
    
    //método para modificar una contraseña
    //Se introduce una contraseña por teclado
    //si la contraseña introducida es fuerte se modifica la contraseña actual
    //Si no es fuerte, la contraseña actual no se modifica
    public boolean modificarContraseña(){
        Scanner sc = new Scanner(System.in);
        String cadena = contraseña; //guardamos la contraseña actual
        System.out.println("Modificar la contraseña");
        System.out.print("Introduzca nueva contraseña: ");
        contraseña = sc.nextLine();
        if(esFuerte()){
            return true;
        }
        contraseña = cadena; //si no es fuerte recuperamos la contraseña original
        return false;
    }
}//Fin clase Password

Clase principal para probar la clase Password

//Clase principal
public class ClasePasswordJava {

    public static void main(String[] args) {
        //Se crea una contraseña de longitud 12
        Password pass = new Password(12);
        //se muestra por pantalla
        System.out.println("Contraseña creada: " + pass.getContraseña());
        //Se muestra si es fuerte o no
        System.out.println(pass.esFuerte() ? "Es fuerte" : "No es fuerte");
        //Se introduce una nueva contraseña para modificar la anterior
        //Se muestra el resultado de la modificación
        if(pass.modificarContraseña()){
            System.out.println("Nueva contraseña: " + pass.getContraseña());
        }else{
            System.out.println("La contraseña introducida no es fuerte");
            System.out.println("la contraseña original no ha sido modificada: " + pass.getContraseña());          
        }
    }
    
}

Ejemplos de ejecución del programa

Ejemplo 1. En este ejemplo introduce introduce como nueva contraseña una contraseña que no es fuerte. En este caso la contraseña actual no se modifica

Contraseña creada: B7_._.E_MkSV
No es fuerte
Modificar la contraseña
Introduzca nueva contraseña: hsB781
La contraseña introducida no es fuerte.
La contraseña original no ha sido modificada: B7_._.E_MkSV                                                        

Ejemplo 2. En este caso se introduce introduce como nueva contraseña una contraseña fuerte. Ahora la contraseña actual sí se modifica y se cambia por la contraseña introducida

Contraseña creada: .59inQP32S_.
Es fuerte
Modificar la contraseña
Introduzca nueva contraseña: 5A3Bzz.XY                                                                            
Nueva contraseña: 5A3Bzz.XY

2 comentarios: