En mi experiencia como programador de programas de gestión, cuando realizo una aplicación y esa aplicación sé que la utilizará bastantes usuarios, lo primero que diseño y creo (aparte de la estructura de la aplicación) es la pantalla de inicio, altamente llamada “Login”. El objetivo de esa pantalla es que el usuario introduzca su nombre de usuario y su contraseña para que, si los datos son correctos, pueda utilizar la aplicación. Pues bien, en este ejemplo os voy a explicar paso a paso como hacer login en .NET y SQL Server (podéis utilizar la versión Express, que es gratuita).
1.- SQL Server: Montar la tabla “Usuario”
Vamos a ir a la base de datos (en caso de no tener ninguna base de datos, creadla) y vamos a crear una tabla llamada “Usuario”. Esta tabla tendrá como objetivo almacenar a los usuarios que tendrán acceso a la aplicación. Esta tabla tendrá los siguientes campos:
- DNI: DNI (o NIE) del usuario (clave primaria)
- Nombre: Nombre del usuario
- Apellidos: Apellidos del usuario
- Email: Correo electrónico del usuario (si tiene)
- Contraseña: Contraseña del usuario
- Activo: Denota si el usuario está activo o no
2.- SQL Server: Crear el procedimiento “log_usuario”
Siempre se ha recomendado que las consultas se ejecuten directamente desde la base de datos, llamando al procedimiento desde el código de la aplicación. Pues dicho y hecho, vamos a crear un procedimiento (en bases de datos esto se llama “Stored Procedure” o “Procedimiento almacenado”) al cual le pasaremos dos parámetros y nos devolverá el resultado de una consulta realmente sencilla.
1 2 3 4 5 6 7
CREATE PROC log_usuario @dni CHAR(9), @contraseña VARCHAR(100) AS BEGIN SELECT * FROM usuario WHERE DNI=@dni AND Contraseña=@contraseña AND Activo=1 END
Nombraremos al procedimiento “Log_usuario” y le pasaremos dos parámetros: el DNI y la contraseña. Entonces, con estos parámetros ejecutaremos una consulta para ver si hay algún registro con ese DNI y esa contraseña. Además, el usuario tiene que estar activo.
Una vez tengamos el procedimiento almacenado, lo ejecutaremos y quedará guardado en la base de datos esperando que alguien haga una llamada a ese procedimiento.
Con esto ya tenemos la base de datos preparada. Pasemos a la programación.
3.- .NET: Diseñar el formulario
Una vez con la base de datos preparada, vamos a preparar la parte de Visual Studio. Cabe decir que el ejemplo que veréis lo he realizado en Visual Basic .NET, pero podéis utilizar los demás lenguajes que vienen en Visual Studio, tales como C++ o C#. Eso si, adaptando el código para cada lenguaje.
Para la parte del diseño de formulario cogeremos un simple formulario de Windows (también conocido como Windows Forms)
Introduciremos dos labels, dos textbox y un botón para validarnos. A partir de aquí sois libres de poder poner lo que queráis (imágenes, menús, etc.). Para el ejemplo tenéis que tener algo parecido a esto:
Por cierto, la propiedad “PasswordChar” del textbox de la contraseña ha de tener el símbolo del asterisco, para que no se vea lo que se escriba.
Con esto, la parte del diseño del formulario ya estará lista.
4.- .NET: Picar el código
Haremos doble click en el botón y introduciremos el siguiente código. El botón tiene la siguiente lógica:
- Si los textbox tienen contenido: nos conectamos a la base de datos, ejecutamos el Stored Procedure que hemos llamado “log_usuario” pasandole los argumentos (que será el contenido de los textbox).
- Si la consulta devuelve una fila (Hasrows): mostraremos un mensaje confirmando que existe ese usuario.
- Si la consulta no devuelve ninguna fila: mostraremos un mensaje de error indicando que no existe ese usuario o que no está activo.
- Si los textbox no tienen contenido: mostramos un mensaje de error indicando al usuario que introduzca todos los datos.
Muy importante: tenéis que utilizar el espacio de nombres (namespace) llamado system.data.sqlclient. Para ello, una vez esteis dentro del diseñador del formulario, tendréis que escribir lo siguiente: imports system.data.sqlclient. Ha de quedar como la imagen
Una vez hecho el inciso, pasemos al código del botón:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
Private Sub Button1_Click(ByVal sender As SystemObject, ByVal e As SystemEventArgs) Handles Button1Click 'declaramos las variables a utilizar Dim cnn As SqlConnection Dim cmd As SqlCommand Dim dr As SqlDataReader 'Si el textbox1 (DNI) y el textbox2 (contraseña) tiene algún campo, procederemos a mirarlo If TextBox1TextLength <> 0 And TextBox2TextLength <> 0 Then 'hacemos un try/catch por si falla la conexión a la base de datos Try 'nos conectamos a la base de datos ''AQUI PONDREMOS LA CADENA DE CONEXIÓN CON LA BASE DE DATOS cnnOpen() 'llamamos el procedimiento almacenado cmd = New SqlCommand("log_usuario", cnn) cmdCommandType = CommandTypeStoredProcedure 'introducimos los parámetros With cmdParameters AddWithValue("@dni", textbox1text) AddWithValue("@contraseña", textbox2text) End With 'ejecutamos la consulta dr = cmdExecuteReader 'si tiene un resultado, quiere decir que el usuario existe y que está activo If drHasRows Then 'el usuario existe y está activo MessageBoxShow("El usuario existe", "Ejemplo login - OK", MessageBoxButtonsOK, MessageBoxIconInformation) Else 'el usuario no existe o no está activo MessageBoxShow("El usuario no existe o no está activo", "Ejemplo login - Error", MessageBoxButtonsOK, MessageBoxIconError) End If Catch ex As Exception Messageboxshow(exmessage) Finally 'desconectamos de la base de datos If cnnState = ConnectionStateOpen Then cnnClose() End If End Try Else 'Quiere decir que falta algún campo por llenar Messageboxshow("Por favor, rellene todos los campos", "Ejemplo login - Error", MessageBoxButtonsOK,MessageBoxIconError) End if End Sub
5.- Notas finales
Este código es bastante sencillo: lo único que hace es realizar una consulta a una base de datos SQL Server y devolver un resultado. Con esto quiero decir que es posible escalarlo y ampliarlo con más y más funciones (por ejemplo, podemos crear la función para que calcule la letra del DNI y que en caso de que no corresponda pues enviar una alerta).
Es más, en el ejemplo no he cifrado la contraseña (para facilitar el tutorial), pero las contraseñas siempre (de hecho, es altamente recomendable) tienen que estar cifradas para mayor seguridad. Hay funciones de encriptación, o puedes crearte una función propia para almacenar y consultar datos cifrados.
O en caso de desarrollar una aplicación en n-capas, trocearíamos el código y pondríamos cada sección en su sitio:
- Capa de datos: aquí guardaremos la parte de la conexión
- Capa de negocio: aquí crearíamos una clase donde tendríamos toda la lógica del formulario “login”
- Capa de presentación: el formulario solamente se encargaría de hacer un llamamiento a la capa de negocio y le pasaríamos los parámetros de los textbox
Es lo bueno que tiene la programación, que los límites los pones tu. Mientras tanto, podéis hacer los programas tan grandes como queráis. Pero para haceros el ejemplo, con esto es más que suficiente. Espero que os haya servido de ayuda y, como siempre, tenéis la sección de comentarios para que podáis decir la vuestra.