▷ 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.
Curso de JAVA: Cómo crear un Login? (Con conexión a base de datos) |
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”:
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.
-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):
*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):
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:
*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):
*Si ejecutamos nuestro formulario de acceso, podremos verificar que si digitamos datos incorrectos, no podremos ingresar al sistema:
*En caso contrario:
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...
PARA TENER EN CUENTA:
ResponderBorrarSi 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.
me tira este error
Borrarjava.sql.SQLException: Parameter index out of range (1 > number of parameters,
which is 0).
Podrías realizar un tutorial, da igual si es en video o explicado en texto de como realizar este mismo proceso del login pero para eclipse? Ya tengo un proyecto web bastante avanzado y empezar de nuevo en NetBeans sería demasiado tiempo. Gracias de antemano.
BorrarDIOS le bendiga varón me han servido mucho sus aportes...... !!!!
ResponderBorrarAmén mi estimado GunBoundhacker, Dios te bendiga igualmente y en gran manera.
BorrarNo olvides compartir estos recursos con tus amigos y conocidos, en las redes sociales.
¡CRISTO TE AMA!
Bendiciones...
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.
ResponderBorrarSaludos estimado Isaac.
BorrarGracias 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...
no me sale nada me sale error
ResponderBorrarSaludos estimado Cris Salazar.
BorrarMe podrías regalar el error (texto) que te está saliendo.
Bendiciones...
Gracias por compartir estimado! :)
ResponderBorrartengo muchas consultas espero no molestarte y tengas un tiempo para responder, GRACIAS!
Saludo estimado Victor Santos.
BorrarPara cualquier consulta no dudes en dejar tus comentarios, o escribirnos al formulario de contacto, dando clic aquí.
Bendiciones...
me podrian ayudar?,
ResponderBorrartodo 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??,
Saludos estimado Lucas.
BorrarRegálame el código donde capturas los datos de Usuario y Contraseña en tu Formulario.
Bendiciones...
Que es "Formulario"?
ResponderBorrarSaludos 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.
Borrar¡CRISTO TE AMA!
Bendiciones...
hola , disculpa yo guardo conraseña tipo blob como tu y me sale que esta incorrecto , me podrias ayudar?
ResponderBorrarSaludos estimado visitante, por favor regálame las sentencias SQL que usas para GUARDAR y CONSULTAR una contraseña desde JAVA.
BorrarBendiciones...
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?
ResponderBorrarDisculpe la molestia. GRACIAS
Saludos estimada Alma Lopez, muchas gracias a ti primeramente por tus comentarios.
BorrarCon 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...
amigo buenas noches queria comunicarte que me sale este error.
ResponderBorrarorg.apache.commons.dbcp. SQL Nested Exception: Cannot create Pool able Connection Factory (acces denied for user root@localhost (using password: YES))
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).
BorrarBendiciones...
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)
ResponderBorrarpracticamente no la clase el jFrame pero me dice que no existe
BorrarSaludos 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".
BorrarPara 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...
Tiene la misma logica si cambio mi base de datos a Oracle?
Borrarhola buenos dias, todo sale bien pero quisiera hacer que segun el usuario lo mande a un jframe especifico, como podria hacerlo?
ResponderBorrarSaludos estimado colega, algo sencillo que puedes hacer es usar un condicional del tipo "if", donde evaluarás el tipo de usuario y así determinarás que JFrame mostrar.
Borrar¡CRISTO TE AMA!
Bendiciones...
Hola que tal me aparece un error en esta linea:
ResponderBorrarpool metodospool = new pool(); utilizo eclipse y ya exporte las librerias que dices en otro tutorial, sigue marcando ese error, no reconoce la palabfa pool
Saludos estimado Jordy Espejel, te recomiendo tener en cuenta los siguientes puntos:
Borrar1. Debes tener en cuenta que al crear una instancia de tu Clase, esta debe concordar con el nombre de la misma (teniendo en cuenta mayúsculas y minúsculas); es decir, si tu Clase se llama Pool, entonces dicha instancia deberá estar así:
Pool metodospool = new Pool();
y no así:
pool metodospool = new pool();
2. Si estás instanciando tu Clase Pool en otra Clase que no está dentro del mismo paquete, entonces deberás colocar la siguiente línea de código en los import:
import Metodos.Pool;
Donde "Metodos" es el nombre del paquete donde tienes tu Clase Pool.
¡CRISTO TE AMA!
¡NUNCA LO DUDES!
Bendiciones...
No había creado la clase Pool por eso marcaba error, también me di cuenta de que tu código es para MYSQL y yo estoy utilizando SQL Server, tendrás algún de como conectarlo con eclipse?tutorial?
BorrarMuchas gracias por responder, buen día.
Estimado Jordy Espejel; a continuación, verás un código de cómo deberá quedar la Clase Java que te permitirá conectarte con SQL Server:
BorrarProporcionado por Josue Gutierrez en nuestro Canal de YouTube
******************************************************
POOL DE CONEXIONES PARA SQLSERVER Y JAVA
******************************************************
package modelo;
import java.sql.*;
import javax.sql.DataSource;
import javax.swing.JOptionPane;
import org.apache.commons.dbcp.BasicDataSource;
public class ConexionSQLServer {
Connection cn;
DataSource dataSource;
String user = "sa";
String password = "2017sistemaL";
String db = "dbcontribuyente";
public Connection conectar() {
String conexionUrl = "jdbc:sqlserver://localhost:1433;"
+ "databaseName=" + db
+ ";user=" + user
+ ";password=" + password;
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
bds.setUrl(conexionUrl);
bds.setMaxActive(50);
dataSource = bds;
try {
cn = dataSource.getConnection();
System.out.println("Conexion Exitosa!!!");
} catch (SQLException ex) {
System.out.println(ex.getMessage());
JOptionPane.showMessageDialog(null, "Fallo al recibir base de datos");
}
return cn;
}
public static void main(String[] args) {
ConexionSQLServer co = new ConexionSQLServer();
Connection cnn = co.conectar();
if (cnn != null) {
JOptionPane.showMessageDialog(null, "Perrrrrfecto");
try {
cnn.close();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, ex);
}
} else {
JOptionPane.showMessageDialog(null, "No pasa nada");
}
}
}
¡CRISTO TE AMA!
¡ACÉPTALO HOY COMO TU SALVADOR!
Bendiciones para ti y toda tu familia...
Una duda, me sale "java.lang.NullPointerException".
ResponderBorrarPor que sera, puse todo como se debía excepto el "dataSource"
Uso el phpmyadmin, podria ayudarme?
Saludos estimado, a que te refieres con: excepto el dataSource.
BorrarMe podrías regalar tu código?
Bendiciones...
como se haria para que mostrar 3 diferentes pantallas para 3 timpos de usuarios ?
ResponderBorrarSaludos estimado visitante, para una asesoría más personalizada te invitamos a que nos escribas al correo: desarrollouh@hotmail.com
BorrarBendiciones...
Buenas amigo, gracias por el tutorial, estoy realizando un login con javafx y postgres y me sale este error.
ResponderBorrarCaused by: java.lang.NullPointerException
at bd.validarLogin.validar_ingreso(validarLogin.java:18)
at controlador.LoginControlador.Ingresar(LoginControlador.java:50)
... 58 more
la linea 18 es esta String usuario = LoginControlador.txt_usuario.getText();
y la linea 50 es if(validar.validar_ingreso()==1){
como puedo solucionarlo gracias.
Muy buen tutorial pero si utlilizaras en java, MVC ¿dónde va el método validar_ingreso, en el modelo o en el controlador?
ResponderBorrarAmigo ...muchas gracias ...solo le quite lo del pool y ya funciona con Mysql
ResponderBorrarAmigo estoy en un proyecto final y estoy buscando la manera mas factible para ponerlo con Mysql, me podrias motrar como lo tienes? grabieldelanieve@gmail.com
BorrarHola me marca error en varias partes
ResponderBorrarGracias amigo!!!!!! me sirvio a la perfeccion!!!
ResponderBorrarBuenas amigo, gracias por el tutorial, estoy realizando un login con javafx y postgres y me sale este error.
ResponderBorrarCaused by: java.lang.NullPointerException
at bd.validarLogin.validar_ingreso(validarLogin.java:18) https://coaching-mastery.com/5-mejores-sitios-web-para-ver-series-y-peliculas-online-gratis-en-espanol-latino/