Está en la página 1de 9

Autentificacion de usuarios en java con MySQL

19 ENERO 2011 144 COMENTARIOS

En algunos sistemas a veces un requerimiento es que se manejen prinvilegios y por lo tanto usuarios, este es un ejemplo muy sencillo que muestra como se podria autentificar a los usuarios para entrar al sistema. Sin mas rodeos muestro el ejemplo y espero que a alguien mas le sirva, primero que nada quiero mostrar la estructura de la tabla que se usa en este programa. Aca la imagen:

Estructura de tabla de usuarios

Aca la imagen de la ventana de login, obviamente el usuario escribe su nombre de usuario (previamente asignado por el administrador del sistema) y su password. y debe dar click en el boton aceptar para entrar:

Ventana de login

en caso de que el usuario haya introducido algun dato incorrecto se mostrara un mensaje avisando, igualmente se mostrara un mensaje correspondiente cuando se deje algun campo vacio:

Mensaje error ventana login

en caso de que el usuario escriba los datos correctos se debe mostrar la interfaz principal del sistema, que en este caso e diseado una muy sencilla y es esta:

Ventana principal del sistema

Por ultimo muestro el codigo de de la ventana de login VentanaLogin.java

001 // Instituto Tecnologico de Zacatepec // Descripcion: Ventana de login para autenticar un usuario 002 para accesar a un sistema 003 // Author: Gonzalo Silverio gonzasilve@hotmail.com

004 // 005 006

Archivo: VentanaLogin.java

007 package testmysql; 008 import javax.swing.*; 009 import java.io.*; 010 import java.sql.*; 011 import java.awt.Panel.*; 012 import java.awt.*; 013 import java.awt.event.*; 014 015 public class VentanaLogin extends JFrame 016 { 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 // crear etiqueta y cuadro de texxto del usuario txtUser = new JTextField(10); lblUser = new JLabel("Usuario: "); Container contenedor = getContentPane(); contenedor.setLayout(new FlowLayout()); VentanaLogin() { private JTextField txtUser, txtPass; private JLabel lblUser, lblPass; private JButton btnAceptar, btnCancelar; String usuario, elPassword;

txtUser.setToolTipText("Escriba su nombre de usuario"); 032 contenedor.add( Box.createVerticalStrut(50) ); 033 034 035 036 037 038 039 040 041 042 043 044 //Crear y agregar los botones btnAceptar = new JButton("Aceptar"); //crear etiqueta y cuadro de texxto del pw txtPass = new JPasswordField(10); lblPass = new JLabel("Contrasea: "); txtPass.setToolTipText("Escriba su contrasea"); contenedor.add(lblPass); contenedor.add(txtPass); contenedor.add(lblUser); contenedor.add(txtUser);

045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077

//establecer Boton aceptar por defecto getRootPane().setDefaultButton(btnAceptar);

btnCancelar = new JButton("Cancelar"); contenedor.add(btnAceptar); contenedor.add(btnCancelar);

// Crear un escuchador al boton Aceptar ActionListener escuchadorbtnAceptar = new ActionListener() { public void actionPerformed(ActionEvent evt) { try { //chekar si el usuario escrbio el nombre de usuario y pw if (txtUser.getText().length() > 0 && txtPass.getText().length() > 0 ) { // Si el usuario si fue validado correctamente txtPass.getText() ) ) if( validarUsuario( txtUser.getText(), //enviar datos a validar { // Codigo para mostrar la ventana principal setVisible(false); VentanaPrincipal ventana1 = new VentanaPrincipal(); ventana1.mostrar();

} else { JOptionPane.showMessageDialog(null, "El nombre de usuario y/o contrasenia no son validos.");

JOptionPane.showMessageDialog(null, txtUser.getText()+" "+txtPass.getText() ); txtUser.setText(""); //limpiar 078 campos 079 080 081 txtUser.requestFocusInWindow(); txtPass.setText("");

082 083 084 085 086 087 } else {

JOptionPane.showMessageDialog(null, "Debe escribir nombre de usuario y contrasenia.\n" + 088 "NO puede dejar ningun campo vacio"); 089 090 091 092 093 094 095 096 097 } // }; btnAceptar.addActionListener(escuchadorbtnAceptar); 098 Asociar escuchador para el boton Aceptar 099 100 101 102 103 104 105 106 107 108 }; // Agregar escuchador al boton Cancelar ActionListener escuchadorbtnCancelar=new ActionListener() { public void actionPerformed(ActionEvent evt) { System.exit(0); } // terminar el programa } catch (Exception e) { e.printStackTrace(); } }

10 btnCancelar.addActionListener(escuchadorbtnCancelar); 9 // Asociar escuchador para el boton Cancelar 110 setTitle("Autentificacion de usuarios"); 111 112 113 tamanio setSize(400,150); setResizable(false); // Tamanio del Frame // que no se le pueda cambiar el

//Centrar la ventana de autentificacion en la pantalla Dimension tamFrame=this.getSize();//para obtener las 114 dimensiones del frame Dimension 11 tamPantalla=Toolkit.getDefaultToolkit().getScreenSize(); 5 a obtener el tamanio de la pantalla 11 setLocation((tamPantalla.width-tamFrame.width)/2, 6 (tamPantalla.height-tamFrame.height)/2); //para posicionar 117 118 119 } // fin de constructor setVisible(true); // Hacer visible al frame //par

120 121 122 123 124 125 126 127 // Metodo que conecta con el servidor MYSQL y valida los usuarios boolean validarUsuario(String elUsr, String elPw) throws IOException { try { //nombre de la BD: bdlogin integer

//nombre de la tabla: usuarios // id 128 auto_increment not null <--llave primaria 129 130 131 132 133 // // campos:

usuario char(25) password char(50)

Connection unaConexion = DriverManager.getConnection ("jdbc:mysql://localhost/bdlogin","root", "root");

// Preparamos la consulta Statement instruccionSQL = 134 unaConexion.createStatement(); ResultSet resultadosConsulta = 135 instruccionSQL.executeQuery ("SELECT * FROM usuarios WHERE usuario='"+elUsr+"' AND password='"+ elPw+"'"); 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 } public static void main(String[] args) { VentanaLogin prueba = new VentanaLogin(); prueba.setDefaultCloseOperation(prueba.EXIT_ON_CLOSE); } } } catch (Exception e) { e.printStackTrace(); return false; if( resultadosConsulta.first() ) // si es valido el primer reg. hay una fila, tons el usuario y su pw existen return true; correctamente else return false; incorrectamente //usuario validado //usuario validado

156 }
y ahora el codigo fuente para crear la ventana principal:

ver fuente imprimir?


01 // 02 // 03 // 04 // 05 06 07 package testmysql; 08 import javax.swing.*; 09 import java.awt.*; 10 11 public class VentanaPrincipal extends JFrame 12 { 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 } public void mostrar() { setVisible(true); } } setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); VentanaPrincipal() { setSize(400,400); setTitle("ventana principal"); setLayout(new BorderLayout()); add(Box.createHorizontalStrut(100),BorderLayout.WEST); add(new JLabel("Ventana principal del proyecto "),BorderLayout.CENTER); Instituto Tecnologico de Zacatepec Descripcion: Ventana principal del sistema del sistema Author: Gonzalo Silverio gonzasilve@hotmail.com Archivo: VentanaPrincipal.java

El objetivo de nuestro ejemplo es el de ver qu tenemos que hacer para crear una conexin JDBC con Javasobre una base de datos y ejecutar una consulta. Las tres clases que manejaremos en nuestro ejemplo sern Connection para realizar la conexin a la base de datos, PreparedStatement que ser la que contenga la sentencia SQL y ResultSet que ser la que contenga el resultado. Lo primero que tenemos que saber para realizar la conexin a la base de datos es donde se encuentra dicha base de datos. Para hacer referencia a la base de datos lo podemos hacer directamente mediante la IP o, por ejemplo, mediante una referencia ODBC. As, podramos tener referencias como:
jdbc:db2:10.0.1.10:50000/BD1 (referencia directa) jdbc:odbc:BD1 (referencia por ODBC)

Una vez conocemos la localizacin de nuestra base de datos debemos de saber el nombre de la clase que tiene implementada la conexin a la base de datos. Es lo que llamamos driver. Dependiendo de la forma en la que este implementado el driver, este, recibir el apelativo de driver tipo1, tipo2, tipo3 o tipo4. Si nos ponemos a escribir cdigo, lo primero que debemos de hacer es instanciar la clase del driver.
Class.forName(sDriver).newInstance();

Dicha clase ser la que nos proporcione una conexin a la base de datos, y como bien hemos dicho, la conexin la guardaremos en una instancia de la clase Connection.
con = DriverManager.getConnection(sURL);

Un vez que hemos conseguido una conexin a la base de datos lo siguiente ser el preparar una sentencia SQL en un PreparedStatement. No haremos nada complicado con el SQL, algo as como...
stmt = con.prepareStatement("SELECT titulo FROM libros");

Construida nuestra sentencia, realizamos la ejecucin de la misma. Y el resultado al ResultSet.

rs = stmt.executeQuery();

Un ResultSet no deja de ser una especie de matriz (filas x columnas) que deberemos de recorrer mediante el movimiento de un cursor. Y la forma ms fcil en Java es mediante un bucle while. Y para acceder a las columnas bastar con utilizar los mtodos getXXX del ResultSet: getString() para las cadenas de texto, getDouble() para los decimales, getDate() para las fechas,......
while (rs.next()) System.out.println (rs.getString("titulo"));

Una vez que hemos finalizado el cometido de nuestro ejercicio deberemos de cerrar las conexiones a la base de datos. Para ello invocaremos el mtodo close() sobre los tres objetos mencionados. Y en todo este proceso, las excepciones. No nos debemos de olvidar de ellas. A tal respecto deberemos de ejecutar nuestro cdigo en un bloque try-catch que controle la SQLException. Excepcin comn que se produce en el acceso a la base de datos. El cdigo podra quedar como el que sigue:
try { Class.forName(sDriver).newInstance(); con = DriverManager.getConnection(sURL); try { // La Query stmt = con.prepareStatement("SELECT titulo FROM libros"); rs = stmt.executeQuery(); // Recorremos el resultado while (rs.next()) System.out.println (rs.getString("titulo")); } catch (SQLException sqle) { System.out.println("Error en la ejecucin:" + sqle.getErrorCode() + " " + sqle.getMessage()); }

También podría gustarte