La autentificación de usuarios es una de las partes más comunes en los programas, ya que la mayoría del tiempo no todos los usuarios tienen derecho para editar o ver la información. Para poder realizar este control de acceso la manera más comunmente utilizada es el nombre de usuario y contraseña.
Lo primero que vamos a hacer es crear una ventana como la que se ve en la imagen siguiente, para el campo de password utiliza un JPasswordField, localizado en la paleta de controles en lugar de utilizar un JTextField normal:
Una vez que la ventana está creada podemos crear el código de nuestro botón para autentificar usuarios. La manera más sencilla de conseguir esto (aunque muy poco segura) es utilizar una contraseña estática, que nunca cambia.
Primero vamos a obtener los datos. Por seguridad, el JPasswordField no debe devolver directamente un String (los usuarios podrían introducir caracteres de control en el String y burlar la seguridad del programa). Para resolver este problema Java nos devuelve un arreglo de caracteres con todos los caracteres que agregó el usuario para que podamos verificar este tipo de problemas.
También es importante mencionar que como buena practica de programación vamos a crear un método que se encargue de validar al usuario, porque es util dividir el programa en unidades de control (pequeños pedazos de código que hacen algo específico, como por ejemplo, validar al usuario). El método tendrá como nombre authenticate() y regresará un valor true si el usuario es válido o false si no lo es.
Para leer los datos podemos utilizar el siguiente código:
String user = txtUsername.getText(); // Obtener el password char passArray[] = txtPassword.getPassword(); // Revisar que sean letras y numeros for (int i = 0; i < passArray.length; i++) { char c = passArray[i]; // Si no es letra o numero entonces no es valido if (!Character.isLetterOrDigit(c)) return false; } // Convertir el password a String String pass = new String(passArray);
Nuestro método por el momento siempre regresa true cuando el usuario le manda cualquier password con puras letras y números, por lo que el siguiente paso es realmente verificar que su nombre de usuario y contraseña sean válidos:
if (user.equals("Magus") && pass.equals("password")) { return true; } else { return false; }
El método completo quedaría de la siguiente manera:
public boolean authenticate() { String user = txtUsername.getText(); char passArray[] = txtPassword.getPassword(); for (int i = 0; i < passArray.length; i++) { char c = passArray[i]; if (!Character.isLetterOrDigit(c)) return false; } String pass = new String(passArray); if (user.equals("Magus") && pass.equals("password")) { return true; } else { return false; } }
Y para poder utilizarlo sólo tenemos que mandar llamar el método en todas las rutinas que requieran validar al usuario:
private void btnLoginActionPerformed(java.awt.event.ActionEvent evt) { if (authenticate()) { JOptionPane.showMessageDialog( this, "Bienvenido"); } else { JOptionPane.showMessageDialog( this, "Nombre de usuario o pass no valido"); } }
Como pudimos ver, la autentificación por password estático es un modelo muy débil, por lo que debemos pensar en maneras de hacerlo un poco más seguro. Una manera de lograr esto de manera sencilla (y por lo tanto muy utilizada) es crear una clase que contenga el nombre de usuario, el password y otra información importante sobre el usuario (esto depende del programa) y recorrer el arreglo con un ciclo para verificar que el nombre de usuario y contraseña existan y sean congruentes.
Si sólo se van a tener nombres de usuario y contraseñas y no es necesario guardar más información entonces tambíen se podrían crear un par de arreglos, el arreglo nombres contiene en el índice i al i-ésimo usuario y el arreglo passwords contiene en el índice i el password del i-ésimo usuario.
También podrían utilizarse mapas u otros métodos más sofisticados de relacionar información.