Buenas después de bastante tiempo sin publicar nada por
temas de exámenes, en este post voy a tratar el tema del formulario de login
(LoginForm) que se puede agregar a cualquier proyecto para WindowsForms en
Visual Studio. Es un formulario ya diseñado que nos permitirá que los usuarios
de nuestra aplicación puedan entrar su nombre y su contraseña y una vez
validado puedan acceder a otros formularios de la aplicación. El problema es
que el código brilla por su ausencia. Es sólo un formulario con 2 textboxes
añadidos, uno para el nombre de usuario y otro para la contraseña, una imagen
en la esquina izquierda y un botón de Ok y otro de Cancel. Hay un link para más
información de como implementar la autentificación en http://go.microsoft.com/fwlink/?LinkId=35339)
pero no funciona.
Ya sé que el código podría ser tan simple como escribir un
simple condicional y comprobar que el usuario y la contraseña introducida
coincide con algún valor que ponemos en el código. Sería un simple If PasswordTextBox.Txt = “1234” Then… Esto lógicamente funciona pero tiene el problema de su difícil mantenimiento ya que
la contraseña para validar estaría en el código y podría ser fácilmente
encontrada si el proyecto se descompila. A parte si la aplicación se distribuye
y se quieren agregar más usuarios y más contraseñas se tendría que estar
frecuentemente actualizando. Vamos que no es viable.
La idea es usar bases de datos, en mi caso Access pero con
SQL o MySQL sería lo mismo. Pero aquí hay otro problema que es que si alguien
abre la base de datos verá el nombre de usuario y la contraseña. Por lo que no
nos queda más remedio que encriptar la contraseña en la base de datos por si
alguien la abre no pueda ver las contraseñas. Con .NET es sencillo gracias al
espacio de nombres System.Security.Cryptography
Bueno en el código que voy a colgar vamos a recordar como
hacer operaciones de SELECT, UPDATE e INSERT en una base de datos Access usando
ahora un acceso conectado (es decir sin DataSets ni DataAdapters). Lo que
vamos a repasar como crear una conexión, crear un comando con parámetros, abrir
la conexión, ejecutar el comando y cerrar la conexión. Como lo que vamos a
consultar es si existe en la base de datos un usuario ya creado y sino lo
crearemos y a parte permitiremos cambiar la contraseña vamos a usar 'comando.ExecuteScalar'
para devolver la fila de la base de datos cuyo usuario y contraseña coincide
con el especificado en los parámetros de la consulta, y 'comando.ExecuteNonQuery' para los INSERT y UPDATE -y DELETE- en los
que no quiero que la consulta nos retorne nada. Hoy no voy a usar
'comando.ExecuteReader' ya que no quiero que me devuelva varias filas de la base
de datos.
Un ejemplo de un SELECT en la base de datos Access con 2 parámetros
sería el siguiente:
Dim
conexion As OleDbConnection
= New OleDbConnection()
' Asigno la cadena de conexion a la base de
datos
conexion.ConnectionString
=
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\data\Base.mdb;Persist Security Info=True;Jet OLEDB:Database Password=luna"
' Creo un
comando
Dim
comando As OleDbCommand
= New OleDbCommand()
' Asigno el texto de la consulta SQL
comando.CommandText
= "SELECT COUNT(user) FROM `Usuarios` WHERE
`user`=? and `password`=?"
comando.Connection = conexion
' Añado los parámetros
comando.Parameters.AddWithValue("user", nombre.ToUpper())
comando.Parameters.AddWithValue("password", clave)
Try
' Abro la conexión
conexion.Open()
Dim resultado As String
' Ejecuto la consulta que devolverá 1 si el usuario existe
resultado = comando.ExecuteScalar
If resultado < > 1 Then
'Se ha encontrado el usuario
msgbox("Usuario encontrado")
msgbox("Usuario encontrado")
End
If
Catch
ex As Exception
MessageBox.Show(ex.Message)
err = True
Finally
' Cierro la conexión
conexion.Close()
If conexion IsNot Nothing Then
'
Libero los recursos asignados
conexion.Dispose()
End
If
End Try
De hecho como siempre voy a colgar aquí el código por si alguien
quiere aportar, mejorar o agregarlo a su repositorio de código.
Lo ideal es que en el Visual Studio vinieran más ejemplos
implementados para no tener que perder el tiempo en esos desarrollos que son
idénticos a todas las aplicaciones y centrase más en la lógica de tu aplicación
que es lo que te dará el valor añadido y no el crear un formulario con dos o
tres controles puestos de tal forma. A veces echas de menos estas cosas o por
ejemplo sistemas de Login más complejos, a lo CMS, que puedan mostrar contenido
independiente para cada usuario. Un ejemplo sería el tema de las páginas donde
te puedes descargar facturas electrónicas. Cada cliente tiene acceso sólo a
sus facturas y a parte el hecho de subir y crear facturas no tiene que ser
complicado ya que se subirían todas pero sólo tú tendrás acceso a la que
coinciden con tus datos de Login. Bueno esto ya será un proyecto a más largo
plazo y ya como sitio web para subir a un servidor, si es que en versiones
siguientes del Visual Studio no se animan a los que trabajamos en el mundo de
la empresa a facilitarnos la vida.
En la siguiente entrada colgaré un ejemplo de aplicación
demo o con periodo de evaluación (Trial) que se puede hacer de forma sencilla
con .NET y así ya cubro 2 temas que siempre generan muchos quebraderos de
cabeza a los programadores novatos.
No hay comentarios:
Publicar un comentario