Este artículo está orientado a la aplicación e implementación de una Clase Java desde la cual crearemos un método, que nos permitirá verificar los datos de ingreso a un sistema, con conexión a una Base de datos; este método será implementado y/o llamado desde el botón "Ingresar" de nuestro formulario de acceso:
Clase donde se ubica nuestro método (MetodosLogin.Java):
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;
}
}
Código del botón Ingresar de nuestro formulario de acceso:
private void btnIngresarActionPerformed(java.awt.event.ActionEvent evt) {
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);
}
}
VIDEO TUTORIAL (PASO A PASO)
1- Primero que todo debemos crear un formulario de acceso con sus respectivos elementos: Campo de texto para digitar el nombre de usuario (JTextField), Campo de contraseña (JPasswordField) y el botón Ingresar (JButton). Tanto el campo de usuario como el de contraseña, deberán poseer las propiedades de public y static; lo cual nos permitirá acceder a ellos desde otra Clase.
2- Procedemos a crear en nuestro proyecto, un paquete al cual llamaremos "Metodos", y dentro de este, crearemos una clase la cual vamos a llamar "MetodosLogin".
3- Copia y pega el código resaltado en amarillo, después de la línea de código "package Metodos;" y sobre la línea "public class MetodosLogin {", este fragmento se utiliza para importar las Clases y/o librerías necesarias para poder trabajar con ciertas funcionalidades y métodos:
import Formularios.Login;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;
4- Ahora copia y pega el código resaltado en azul, dentro de la Clase "public class MetodosLogin {}"; es decir, debe quedar rodeado por las llaves ({}) que limitan dicha Clase.La primera parte de este código resaltado en azul, consiste en instanciar un objeto de nuestra clase que nos permite conectarnos con una base de datos mediante un Pool de Conexiones; a dicho objeto le colocaremos por nombre "metodospool":
Pool metodospool = new Pool();
5- Lo siguiente es un método al que se le ha asignado el nombre de "validar_ingreso", este contiene la propiedad "public", y devolverá un valor de tipo "int", que en otras palabras nos permitirá identificar si los datos digitados para ingresar al sistema; tales como el usuario y la clave son correctos o no:public int validar_ingreso(){}
6- Crearemos dos variables de tipo "String", la primera de ellas la llamaremos "usuario"; ahora, podremos ver que en el contenido de dicha variable usamos la palabra "Login" este es el nombre de nuestro formulario de ingreso al sistema, seguidamente separado por un punto (.) encontramos la palabra "txtUsuario" que corresponde al campo de texto (JTextField) donde se digitará el nombre de usuario por parte de la persona que esté intentando acceder al sistema; luego, aplicamos el método ".getText()" para obtener el texto digitado en dicho componente.La segunda variable la hemos llamado "clave", y en su contenido podremos ver que hacemos lo mismo que con la variable "usuario", pero en este caso accedemos al campo de contraseña (JPasswordField) del formulario de acceso, cuyo nombre es "jpassClave" y le aplicamos el método ".getPassword()", dicho método nos devolverá un array tipo "char", por ello debemos emplear la sentencia "String.valueOf()" para poder convertir dicho valor a String.
Esto irá dentro del método del punto anterior:
String usuario = Login.txtUsuario.getText();
String clave = String.valueOf(Login.jpassClave.getPassword());
7- Seguidamente vamos a crear una variable de tipo "int" y que llamaremos en este caso "resultado", inicializándola con un valor de "0" (cero). Esta variable es la que le devolveremos a nuestro método y así poder avisarle si el usuario y contraseña digitados para acceder al programa son correctos o incorrectos.Esta línea irá debajo del código del punto anterior y dentro del método mencionado en el punto 5:
int resultado=0;
8- En esta línea de código, creamos una variable tipo "String" a la que le hemos asignado el nombre de "SSQL", en ella guardaremos la sentencia SQL con la cual consultaremos todos los campos de un registro de nuestra tabla en la Base de datos, utilizando a la vez nuestras variables "usuario" y "clave", verificando de que sí exista un registro con campos que posean dichos valores.Te darás cuenta que al final de dicha sentencia encontrarás que encerramos nuestra variable "clave", dentro de la expresión "sha1()" la cual pertenece a una función y/o método de cifrado, y ese mismo método fue el que se utilizó a la hora de insertar y/o guardar los registros en la tabla, especialmente la contraseña; de tal forma que si tu usaste otro método de cifrado deberás cambiar "sha1" por el que hayas definido, por ejemplo "md5".
Esta sentencia irá debajo del código del punto anterior y dentro del método mencionado en el punto 5:
String SSQL="SELECT * FROM usuarios WHERE usuario='"+usuario+"' AND clave=sha1('"+clave+"')";
9- Definiremos una variable u objeto del tipo "Connection"; cuyo nombre será "conect" y lo inicializaremos con el valor "null". En esta variable vamos a administrar la conexión con nuestra base de datos.
Esta línea irá debajo del código del punto anterior y dentro del método mencionado en el punto 5:
Connection conect = null;
10- De forma siguiente lo que hacemos es crear un bloque "try-catch-finally". Teniendo en cuenta que en el "catch" se capturará una excepción del tipo "SQLException" en una variable la cual llamaremos "ex".Este bloque irá debajo del código del punto anterior y dentro del método mencionado en el punto 5:
try {
} catch (SQLException ex) {
}finally{
}
11- Dentro del "try{}" del punto anterior, vamos a establecer la conexión con nuestra base de datos, para ello usaremos nuestra variable "conect" y en su contenido procedemos a usar el objeto "metodospool" (el cual instanciamos en el punto 4), seguidamente obtenemos el objeto tipo DataSource que nos devuelve la Clase que nos permite realizar la conexión; seguidamente aplicamos el método ".getConnection()" y así finalmente administrar y/o lograr conectarnos con nuestra base de datos.Adicionalmente, vamos a crear un objeto del tipo "Statement" y que llamaremos "st"; ahora, dentro del contenido de este objeto, usamos la variable "conect" a la que le aplicaremos el método ".createStatement()"; esto nos permitirá enviar una sentencia SQL a la Base de datos.
Luego, crearemos un objeto "ResultSet" llamado "rs", en este usaremos el objeto "st" empleando el método ".executeQuery()", al cual le pasamos como parámetro la variable que contiene nuestra sentencia SQL; es decir, "SSQL". Con esto podremos ejecutar la sentencia que estamos enviando a nuestra base de datos y así obtener resultados.
Lo último que haremos dentro del "try{}" será usar un condicional "if", y la condición que usaremos será "rs.next()", esto quiere decir que si al momento de ejecutar la sentencia SQL en nuestra base de datos, se encuentra un registro que vaya acorde a la consulta, se procederá en este caso a realizarse lo que hay dentro del condicional, y que en este caso no es más que asignarle el valor de "1" a nuestra variable resultado:
conect = metodospool.dataSource.getConnection(); Statement st = conect.createStatement(); ResultSet rs = st.executeQuery(SSQL); if(rs.next()){ resultado=1; }12- Dentro del "catch" del punto 10, vamos a usar el componente "JOptionPane", aplicándole el método ".showMessageDialog()" que nos permitirá mostrar un cuadro de diálogo al usuario del sistema. A este componente se le pasarán 4 parámetros, el primero de ellos lo dejaremos "null", el segundo corresponde a la variable "ex" que determinamos en el "catch"; luego, le asignamos un título al componente, en este caso "Error de conexión", y por último determinaremos el tipo de mensaje que se mostrará en el cuadro de diálogo que en fin es un aviso de error, por ello usamos la sintaxis "JOptionPane.ERROR_MESSAGE":
JOptionPane.showMessageDialog(null, ex, "Error de conexión", JOptionPane.ERROR_MESSAGE);
13- En la parte interior del "finally{}" del punto 10, procederemos a crear un bloque "try-catch", usando en el catch una variable del tipo "SQLException" llamada "ex" (tal cual como en el del punto 10).
Dentro del "try{}", usaremos nuestra variable "conect" (definida en el punto 9), a la que le aplicaremos el método ".close()", lo que nos permitirá "cerrar" o mejor dicho, liberar la conexión que hemos establecido con nuestra base de datos, para que quede en la piscina de conexiones y pueda ser utilizada por una nueva petición del programa.
En la parte del "catch" podemos observar que realizamos lo mismo que en el punto 12, pues usamos nuevamente el componente "JOptionPane", lo único que le modificaremos será el tercer parámetro, el cual corresponde al título del cuadro de diálogo, en este caso quedará como "Error de desconexión":
try {
conect.close();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, ex, "Error de desconexión", JOptionPane.ERROR_MESSAGE);
}
14- Finalmente, luego de la llave de cierre "}" del "finally" del punto 10, usaremos la palabra reservada "return" y seguidamente la variable "resultado" del tipo "int" (la cual declaramos en el punto 7); esto lo que nos conlleva es a devolver un valor entero a nuestro método, lo que le avisará si el usuario puede o no acceder al sistema:
return resultado;
15- Copia y pega el código resaltado en verde, dentro del evento y/o método perteneciente al botón "Ingresar" ubicado en el formulario Login de nuestro proyecto Java.Lo primero que hacemos en este bloque de código, es instanciar un objeto de la Clase "MetodosLogin" (la cual vimos y desarrollamos en los puntos anteriores); dicho objeto tendrá por nombre "metodoslogin"; esto nos permitirá usar y/o llamar los métodos creados en dicha Clase.
Este código consta también de un condicional "if-else"; ahora, la condición que usamos "metodoslogin.validar_ingreso()==1", nos permitirá verificar que el valor que nos devuelve la función o método "validar_ingreso()" sea igual a 1; lo que quiere decir en otras palabras, que se han digitado los datos correctos para el ingreso al sistema; en el caso dado de que se cumpla dicha condición, se procederá en primera instancia a cerrar nuestro formulario de acceso, por ello la línea "this.dispose"; luego, se mostrará un cuadro de diálogo dándole al usuario la bienvenida a nuestro sistema y por último instanciamos un objeto de la Clase que contiene el formulario principal de nuestro software, haciéndolo visible al usuario.
En dado caso de que no se cumpla la condición especificada en el "if", se procederá a ejecutar lo que hay dentro del "else", que en este caso no es más que mostrar un cuadro de diálogo informándole al usuario de que los datos que ha digitado para intentar ingresar al sistema, son erróneos:
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);
}
16- Ahora sólo basta con ejecutar tu proyecto y hacer las respectivas pruebas.
17- Si deseas saber cómo crear un Login con conexión a Base de datos, usando un entorno gráfico como Netbeans IDE, puedes visitar el siguiente enlace:
18- Si te interesa, puedes seguir el Curso de Java, que se está realizando mediante videotutoriales y con eBooks, en el Blog UH T.I.S
¿Conoces una forma más óptima de realizar el anterior procedimiento?, no dudes en compartirla con todos nuestros amigos de la web.
Si te fue de gran ayuda esta información, no olvides compartirla con tus amigos y en las redes sociales.
Si tienes dudas o sugerencias al respecto; puedes dejarnos tus comentarios.
Bendiciones...
Si te fue de gran ayuda esta información, no olvides compartirla con tus amigos y en las redes sociales.
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:
1- En la sentencia SQL que definimos en el paso #8, 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- En el paso #11, 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.
muy detallado, es el mejor método de enseñanza que he visto para java, todo coincide entre si. Buen trabajo.
ResponderBorrarSaludos estimado Jhefferson, me alegra que te haya sido de gran ayuda este post.
BorrarNo olvides compartir nuestro sitio web, con tus colegas y demás amigos en tus redes sociales, para que al igual que tú puedan solucionar inconvenientes referentes a la programación (desarrollo de software).
¡CRISTO TE AMA!
Bendiciones...
me sale error al querer importar el login
ResponderBorrarimport.formularios.login;
Saludo Cordial.
BorrarEstimado jorgecs52ee, la línea "import Formularios.Login;" te lanzará error si tu proyecto no tiene un paquete llamado "Formularios" (debes reemplazarlo por el nombre del paquete que contiene tus formularios y/o JFrames), y un JFrame llamado "Login" (debes reemplazarlo por el nombre del JFrame que has construido para que funcione como panel de acceso y/o Login en tu aplicación).
¡CRISTO ES TU AYUDADOR, NO ESTÁS SOLO!
Bendiciones...
buenas tardes estimado tengo una pregunta queria saber si en este metodo hay que tener su tabla ya hecha en sql server o es con el login de sql server directo ? si es asi me serviria en la uni ya que lo quieren asi pero no encuentro nada en la web.
ResponderBorrarSaludos estimad@ visitante, debes asegurarte de haber creado la Clase Pool, que te permitirá realizar las conexiones con tu base de datos.
ResponderBorrarPara ver la estructura de dicha Clase, da CLIC AQUÍ.
¡CRISTO TE AMA!
Bendiciones...
666
ResponderBorrarCome on, stupid, lets do it, bro
ResponderBorrarhola quiero ayuda pleasseee .....
ResponderBorrarnecesito crear un metodo que me permita validar que la contraseña ingresada por el usuario cumpla con los siguientes parametros que utilice por lo menos 1 Mayuscula, 1 Minuscula, 1 Caracter Especial, 1 Numero, minimo 8 caraceres