Para tutorías y/o asesorías virtuales sobre JAVA SE y/o MySQL, escríbeme al formulario de contacto.

BUSCA MÁS CONTENIDO AQUÍ:



Curso de JAVA: Cómo crear un Login? (Con conexión a base de datos)




Luego de haber aprendido a crear formularios y a conectar nuestras aplicaciones hechas en Java con una base de datos, tanto de una forma básica o ya sea realizando un Pool de conexiones; ahora podremos fusionar ambas partes y/o conocimientos, para llevar a cabo la construcción de módulos en nuestro software, con una mayor funcionalidad y usabilidad.
En un capítulo anterior, pudimos observar e ilustrar como desarrollar un sencillo y/o básico formulario de acceso o Login en nuestro programa; el cual nos iba a permitir controlar el acceso al sistema a los usuarios previamente dictaminados y/o configurados en nuestro código, haciendo muy limitado el uso del mismo. Por ello, en esta ocasión llevaremos a cabo la construcción de un Login que se comunicará con una base de datos para llevar a cabo la verificación de los datos de acceso al programa como el usuario y la contraseña, que han sido asignados a las personas autorizadas para hacer uso del mismo. Este tipo de formulario de acceso, nos dará la posibilidad de ampliar el uso de un determinado software a más usuarios que se vayan registrando en dicho programa, por parte del administrador de este, el cual podrá darle las autorizaciones y/o permisos respectivos para el uso de algunas o todas las funcionalidades que ofrece el sistema de información.

Explicación por Videotutorial:



Explicación por Foto-Tutorial: 

*Deberemos previamente crear una base de datos y luego crear una tabla que en este caso hemos llamado “usuarios”:

Tabla Usuarios creada en nuestra base de datos

Esta tabla consta de tres campos principales:

-id_usuario: Este será la llave primaria de nuestra tabla, el tipo de datos es entero (INT), con una longitud de 11, auto increment y NOT NULL.

-usuario: Tipo de datos VARCHAR, con una longitud de 15 y NOT NULL.

-clave: Tipo de datos BLOB y NOT NULL. En este campo como su nombre lo indica será donde guardaremos la contraseña de cada usuario, por ello usamos el tipo de datos BLOB ya que nos permitirá guardar cadenas de caracteres binarias (bytes) permitiéndonos aumentar la seguridad de las claves.


*Nos dirigiremos a nuestro proyecto en NetBeans IDE, seleccionamos nuestro paquete “Metodos” y damos clic derecho sobre el mismo; nos ubicamos en la opción “New” (Nuevo) y seguido damos clic sobre “Java Class…” (Clase Java):

Crear una nueva Clase Java en nuestro proyecto
 
*Nos saldrá una ventana “New Java Class” (Nueva Clase Java), en la cual nos ubicaremos en el campo “Class Name” (Nombre de la Clase) allí como su nombre lo indica digitaremos un nombre para nuestra Clase que en esta oportunidad llamaremos “MetodosLogin”; por último, damos clic en el botón “Finish” (Finalizar), y de esta manera nuestra Clase se habrá creado:

Asignando un nombre a nuestra Clase Java
Clase Java creada en nuestro proyecto


*Antes de seguir con nuestra Clase, nos dirigiremos al formulario de acceso que creamos en un capítulo anterior de este curso, allí seleccionaremos el campo de texto donde se digitará el nombre de usuario; luego, damos clic derecho y escogemos la opción “Customize Code” (Personalizar el Código):

Seleccionamos el JTextField donde se digitará el nombre de usuario
 
*Nos aparecerá una nueva ventana en la cual nos desplazaremos hacia la parte inferior, ubicándonos en la lista desplegable “Access”, donde deberemos seleccionar la opción “public” y seguidamente deberemos activar la casilla “static”; luego, damos clic en el botón “OK”, y clic en el botón “Save all files” (guardar todos los archivos) de la ventana principal de NetBeans IDE:

Configurando las propiedades de acceso al componente JTextField
Clic en el botón guardar de la ventana principal de Netbeans IDE

El procedimiento anterior deberemos realizarlo igualmente con el campo de contraseña (JPassswordField).





 
*Ahora, en la Clase “MetodosLogin” crearemos un método especial que nos permitirá llevar a cabo la verificación de los datos de ingreso al sistema; tales como, el usuario y la clave; para ello procedemos a realizar una consulta en la tabla "usuarios" de nuestra base de datos.
Nuestra Clase quedará de la siguiente forma:

package Metodos;

import Formularios.Login;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;


public class MetodosLogin {

Pool metodospool = new Pool();

public int validar_ingreso(){

    String usuario = Login.txtUsuario.getText();
    String clave = String.valueOf(Login.jpassClave.getPassword());

    int resultado=0;
    
    String SSQL="SELECT * FROM usuarios WHERE usuario='"+usuario+"' AND clave=sha1('"+clave+"')";

    Connection conect = null;

    try {

        conect = metodospool.dataSource.getConnection();
        Statement st = conect.createStatement();
        ResultSet rs = st.executeQuery(SSQL);

        if(rs.next()){

            resultado=1;

        }

    } catch (SQLException ex) {

        JOptionPane.showMessageDialog(null, ex, "Error de conexión", JOptionPane.ERROR_MESSAGE);

    }finally{


        try {

            conect.close();

        } catch (SQLException ex) {

            JOptionPane.showMessageDialog(null, ex, "Error de desconexión", JOptionPane.ERROR_MESSAGE);

        }

    }

return resultado;

}

}

Si quieres una explicación más detallada sobre cada línea del código anterior, no dudes en visitar la siguiente entrada: "Código JAVA: Login con conexión a Base de datos."

*Una vez que tengamos lista nuestra Clase, procederemos a dar doble clic sobre el botón “Ingresar” de nuestro formulario Login:

Doble clic en el botón ingresar de nuestro formulario Login

*Cuando entremos al método de dicho botón, borraremos el comentario que está por defecto y pegaremos el siguiente código:

MetodosLogin metodoslogin = new MetodosLogin();

if(metodoslogin.validar_ingreso()==1){
                 
        this.dispose();

        JOptionPane.showMessageDialog(null, "Bienvenido\n Has ingresado "
        + "satisfactoriamente al sistema", "Mensaje de bienvenida",
        JOptionPane.INFORMATION_MESSAGE);

        Formulario1 formformulario1 = new Formulario1();          
        formformulario1.setVisible(true);

}else {
                    
        JOptionPane.showMessageDialog(null, "Acceso denegado:\n"
        + "Por favor ingrese un usuario y/o contraseña correctos", "Acceso denegado",
        JOptionPane.ERROR_MESSAGE);
            
}

*En este código, lo que hacemos es llamar al método que creamos con anterioridad y luego validar a través de un condicional "if" que se cumpla un requisito (que el método nos devuelva un valor igual a 1) y proceder a ejecutar lo que allí definimos, en caso contrario se llevará a cabo lo que planteamos en la parte del "else".
Si quieres una explicación más detallada sobre cada línea del código anterior, no dudes en visitar el siguiente artículo: "Código JAVA: Login con conexión a Base de datos."

*Seleccionaremos ahora el archivo Login.java; es decir, el formulario Login de nuestro proyecto, damos clic derecho sobre el mismo y escogemos la opción “Run File” (ejecutar archivo):

Procedemos a ejecutar el archivo .java del formulario Login de nuestro proyecto

*Si ejecutamos nuestro formulario de acceso, podremos verificar que si digitamos datos incorrectos, no podremos ingresar al sistema:

JOptionPane informándonos que los datos de ingreso al sistema están errados

*En caso contrario:

JOptionPane dándonos la bienvenida al sistema, luego de ingresar el usuario y clave correctos

Formulario principal de nuestro sistema de información

Ahora tenemos la posibilidad de integrar este módulo a nuestras aplicaciones, brindando así a nuestros usuarios y/o clientes; mayor seguridad y privacidad de la información de su empresa.

Si deseas descargar el video, junto con el fascículo del presente tema, sólo debes dirigirte a nuestra Zona de Descargas, y dar clic sobre el icono "Curso de JAVA Parte 14".

Para ver la Parte 13 del Curso, puedes dar clic en el siguiente enlace: "Curso de JAVA: Cómo hacer un Pool de Conexiones?" 
Para ampliar más tus conocimientos en cuanto a desarrollar software en el lenguaje de programación JAVA, puedes ver todos los capítulos de "Cómo lo hago en JAVA?"

Si te fue de gran ayuda este material, no olvides compartirlo con tus amigos. 
Si tienes dudas o sugerencias al respecto; puedes dejarnos tus comentarios.
Bendiciones...




Comparte este artículo






Sobre El Autor

Eduardo Bastidas UH

Cristiano y Colombiano. Analista de Sistemas & Blogger.
Me motiva mucho el poder compartir día tras día lo que he aprendido y voy aprendiendo en el área de las Tecnologías de la Información y las Comunicaciones.

23 comentarios:

  1. PARA TENER EN CUENTA:

    Si deseamos reducir el riesgo de ataques por inyección SQL, haremos unos pequeños cambios en el código del método "validar_ingreso()":

    1- En la sentencia SQL que definimos, reemplazaremos las variables por signos de interrogación. Por lo cual quedaría de la siguiente manera:

    String SSQL="SELECT nivel FROM usuarios WHERE usuario=? AND clave=sha1(?)";

    2- Haremos los siguientes cambios:

    * Reemplazaremos la línea de código:

    Statement st = conect.createStatement();

    Por:

    PreparedStatement st = conect.prepareStatement(SSQL);

    Nota: Lo que aquí hacemos es instanciar un objeto de la Clase PreparedStatement, lo que nos va a permitir preparar la sentencia SQL, mejorando la eficiencia a la hora de ejecutarla. Además, evitará que personas mal intencionadas con conocimientos, agreguen a la sentencia un trozo de código SQL que perjudique nuestra base de datos e información en general.

    *Debajo del código anterior, añadiremos las siguientes líneas:
    st.setString(1, usuario);
    st.setString(2, clave);

    Nota: Aquí lo que se hace es usar el objeto st (PreparedStatement), y le aplicamos el método ".setString()" para asignar un valor tipo String a cada signo de interrogación que establecimos en la sentencia SQL, claro está que dependiendo del tipo de datos a guardar podemos usar los métodos respectivos (ej. .setInt(), .setDate()). A dicho método le pasaremos 2 parámetros, el primero corresponde al número del campo (en este caso sólo hay dos), y el segundo hace referencia a la variable que contiene el valor a asignar a dicho campo.

    *En la línea de código:

    ResultSet rs = st.executeQuery(SSQL);

    Quitaremos el parámetro que le pasamos, que en este caso es la sentencia SQL, por lo que nos quedaría de la siguiente manera:

    ResultSet rs = st.executeQuery();

    Ya con estos pasos reduciremos en gran parte el riesgo de que nuestro sistema sufra daños por ataques externos.

    ResponderEliminar
    Respuestas
    1. me tira este error

      java.sql.SQLException: Parameter index out of range (1 > number of parameters,
      which is 0).

      Eliminar
  2. DIOS le bendiga varón me han servido mucho sus aportes...... !!!!

    ResponderEliminar
    Respuestas
    1. Amén mi estimado GunBoundhacker, Dios te bendiga igualmente y en gran manera.
      No olvides compartir estos recursos con tus amigos y conocidos, en las redes sociales.

      ¡CRISTO TE AMA!

      Bendiciones...

      Eliminar
  3. Ok todo Bien Gracias Eduardo pero el tipo de dato BLOB no le entiendo no se como meter la contraseña ahi asi que lo cambie por un VARCHAR para poder ingresar la contaseña en ese campo de la tabla y a la hora de digitarlo en el formulario login ya me dejara entrar. Gracias por compartir.

    ResponderEliminar
    Respuestas
    1. Saludos estimado Isaac.
      Gracias a ti por recurrir a nuestro blog para despejar tus dudas y aprender un poco más.
      Con respecto a lo del campo BLOB, este te permitirá cifrar tu contraseña y por lo tanto aumentar la seguridad.
      A continuación, te dejaré un link donde encontrarás la explicación de la sentencia SQL que te permitirá entender cómo almacenar tu contraseña en este tipo de campos:

      Clic aquí -> Sentencia SQL: Almacenar registros en una tabla de la base de datos

      ¡CRISTO TE AMA!

      Bendiciones...

      Eliminar
  4. Respuestas
    1. Saludos estimado Cris Salazar.
      Me podrías regalar el error (texto) que te está saliendo.

      Bendiciones...

      Eliminar
  5. Gracias por compartir estimado! :)
    tengo muchas consultas espero no molestarte y tengas un tiempo para responder, GRACIAS!

    ResponderEliminar
    Respuestas
    1. Saludo estimado Victor Santos.

      Para cualquier consulta no dudes en dejar tus comentarios, o escribirnos al formulario de contacto, dando clic aquí.

      Bendiciones...

      Eliminar
  6. me podrian ayudar?,
    todo sale bien si en el comando select, en ves de
    poner:
    Nombre='"+usuario+"' AND Contraseña='"+contraseña+"'
    pongo:
    Nombre='Lucas' AND Contraseña='123456789'
    pero a la hora de ponerlo con variables me dice siempre que estan los usuarios y contraseñas incorrecto, y si yo los pongo en un JOptionPane.showMessage a esas variables, me salen como vacias :(, que puede ser??,

    ResponderEliminar
    Respuestas
    1. Saludos estimado Lucas.

      Regálame el código donde capturas los datos de Usuario y Contraseña en tu Formulario.

      Bendiciones...

      Eliminar
  7. Respuestas
    1. Saludos estimado Carlos Adan Luna Montelongo, "Formulario1" en este caso es el nombre de la Clase y/o JFrame (Ventana Principal) de tu proyecto JAVA, que tú deseas abrir una vez ingreses los datos de acceso (Usuario y Clave) de forma correcta en tu Login.

      ¡CRISTO TE AMA!

      Bendiciones...

      Eliminar
  8. hola , disculpa yo guardo conraseña tipo blob como tu y me sale que esta incorrecto , me podrias ayudar?

    ResponderEliminar
    Respuestas
    1. Saludos estimado visitante, por favor regálame las sentencias SQL que usas para GUARDAR y CONSULTAR una contraseña desde JAVA.

      Bendiciones...

      Eliminar
  9. Muy buen contenido y buena explicación GRACIAS por compartir sus conocimientos, recientemente he seguido sus pasos para crear una pantalla de autentificacion pero me arroja error no he logrado solucionarlo tengo todas las librerías en orden así como los paquetes y variables, el error que me arroja es en la linea conect=metodosPool.dataSourse.getConnection(); despues de metodosPool(si lo activa en verde) el .dataSourse no lo activa en verde; me surgió una duda en el código del Pool en esta linea public String url = "jdbc:mysql://localhost/"+db; no es nesesario poner el puerto como 3306 ¿por que?
    Disculpe la molestia. GRACIAS

    ResponderEliminar
    Respuestas
    1. Saludos estimada Alma Lopez, muchas gracias a ti primeramente por tus comentarios.
      Con respecto al error que te sale, por favor verifica lo siguiente:

      1. Verifica que tu Clase Pool (clic aquí para ver la Clase Pool) esté bien estructurada.
      2. En tu Clase Pool verifica que la variable datasource esté de la siguiente forma:
      "public DataSource dataSource;"
      3. Recuerda que antes de cargar las librerías en tu Clase Pool debes cerciorarte de que estén descomprimidas.
      4. Si sigues con el inconveniente, por favor deja en un comentario la estructura de tu Clase Pool() y la de tu Clase MetodosLogin().

      De acuerdo a la duda de que por qué no se coloca el puerto 3306 en la línea de código "public String url = "jdbc:mysql://localhost/"+db;" se debe a que es el puerto que por defecto usa MySQL y por tal motivo automáticamente la conexión se dirigirá a dicho puerto; sin embargo, si llegas a cambiar este puerto a la hora de configurar MySQL, obligatoriamente deberás colocar el número del puerto en tu línea de código.

      ¡CRISTO TE AMA!

      Bendiciones...

      Eliminar
  10. amigo buenas noches queria comunicarte que me sale este error.
    org.apache.commons.dbcp. SQL Nested Exception: Cannot create Pool able Connection Factory (acces denied for user root@localhost (using password: YES))

    ResponderEliminar
    Respuestas
    1. Saludos estimado Jose Arrieta, debes tener en cuenta que en la variable "pass" de la Clase Pool, deberás almacenar la clave que le asignaste al usuario "root" cuando instalaste tu gestor de base de datos (MySQL).

      Bendiciones...

      Eliminar
  11. Tengo una duda, en la parte donde esta el "import Formulario.login" lo cambie por el de mi proyecto y me marca el error: package *nombre del paquete* does not exist. lo cambio por una clase y dice que el login no existe (no se si me explique)

    ResponderEliminar
    Respuestas
    1. practicamente no la clase el jFrame pero me dice que no existe

      Eliminar
    2. Saludos estimado yGutierrez, la línea "import Formularios.Login;" es la que te va a permitir usar y/o acceder a los componentes de tu Formulario de acceso (Login) desde la Clase "MetodosLogin".
      Para solucionar tu inconveniente puedes probar una de las siguientes opciones:

      1. En la línea "import Formularios.Login;", debes cambiar el texto "Login" por el nombre que le pusiste a tu JFrame (Formulario de acceso); luego, debes cambiar el texto "Formularios" por el nombre del paquete donde creaste tu JFrame.

      2. La anterior opción debe haberte servido, pero sino, lo que harás será eliminar la línea "import Formularios.Login;" por completo; a continuación, te saldrán errores en tu código, por lo cual te ubicarás en una de esas líneas que contiene error, y en la parte de tu IDE donde se muestra el número de la línea de código podrás ver un icono de bombillo (foco), al cual le darás clic y escogerás la opción de "Add import".

      ¡CRISTO TE AMA!

      Bendiciones...

      Eliminar


RECIBIR NOTICIAS POR EMAIL


Suscríbete al boletín para recibir lo último en tu correo electrónico

¿NECESITAS AYUDA PARA PROGRAMAR EN JAVA SE Y MYSQL?