viernes, 24 de octubre de 2008

Validar Usuario y Contraseña De Una base de Datos Con Visual Basic.net 2005

hola a todos, bueno voy a mostrar como se hace la validacion de usuario y contraseña que han sido ingresados en un tabla de base de datos,en esta ocasion utilizando microsoft visua.net 2005.

Lo primero que tenemos que hacer es crear nuestra base de datos con nuestros usuarios y contraseñas
correspondientes para esto utilizare el mismo entorno de visual basic.net 2005 que nos da la opción de poder crear base de datos sql sin salir de ella:

Ingresamos a visual Basic.net 2005 y creamos un nuevo proyecto






Lo Llamaremos
ValidacionUsuarios y aceptamos.
Bueno ya creado nuestro proyecto nos dirigimos al menú
Proyecto/Agregar Nuevo Elemento












Elegimos La opción
Base De Datos en Blanco y Le ponemos el Nombre BDUSUARIOS y Aceptamos:


Nos aparece el
Asistente Para La Configuracion De Origenes De Datos, en esta ocacion le damos cancelas por que no tenemos ninguna tabla creada:



Si nos fijamos en el Explorador de Soluciones que la Base de Datos ya se agrego



bien ahora tenemos que crear las tablas donde ingresaremos los datos de los usuarios, para eso nos dirigimos al Menu Ver/Explorador de Servidores



Exploramos y en tablas le damos clic derecho y la opción
Agregar Nueva Tabla:



Diseñamos la tabla como muestra la siguiente imagen, no nos olvidemos de la
Clave Primaria solo con clic derecho podremos agregarlo.



Damos Clic en Guardar y le asignamos a la tabla el nombre
USUARIOS



De igual forma Creamos otra tabla para establecer los privilegios del usuario llamado
PRIVILEGIOS y tiene el siguiente diseño:



Para ver como funciona la validadion ingresamo los siguientes registros:

Tabla
PRIVILEGIOS


Tabla
USUARIOS


Para poder ingresar los registros solo tenemo que dar clic derecho en la tabla y elegir la opcion
Mostrar Datos de la Tabla



bien hasta aquí solo nos hemos dedicado a la creación de la Base de Datos, ahora vamos a comenzar crear nuestro formulario de ingreso, por defecto ya visual basic. net nos crea un formulario llamado form1, pasaremos a diseñarlo como muestra la imagen:



Cambiar la propiedad
name de los siguientes controles para un mejor manejo:

Formulario =
frmingreso
boton Ingresar =
btningresar
Boton Salir =
btnsalir
Textbox De Ingreso de Usuario =
txtusuario
Textbox de Ingreso de Password =
txtpassword

Al terminar crear otro formulario Mdi Con el Siguiente Diseño:



Si No Logras ver bien la imagen solo dele clic a la imagen para ampliarla

Bueno listo, voy a explicar como es la logica de este programa:
lo que va hacer es mediante el primer formulario consultar a la base de datos si el usuario y Password ingresados son correctos en la tabla USUARIOS, al tener una respuesta correcta se llamara el segundo formulario, tambien validara los privilegios del usuario, y bloqueara algunas opciones de la barra de menus segun su nivel:

Administrador= Mostrara todas las opciones de la barra de menus
Mienbro= pondra en enabled o desabilitado el menu Administrador
Invitado=desabilitara el menu Administrador y Mienbro

Y por ultimo mostrara en la barra de estado el nombre del usuario.

De caso contrario si no ingresa un usuario o password correcto solo tendra 3 opciones para poder intentar ingresar.

ok ahora vamos a la codificacion:

Primero declaramos a nivel de modulo las siguientes variables para ser reconocido por los dos formularios:

Module Module1
Public opcion As Integer = 1
Public nivel As String
Public usuariov As String
End Module

Damos Doble clic en el boton Ingresar y en la primera line digitar lo siguiente antes del public class:

Imports System.Data.SqlClient
Public Class frmingreso

' codigo del boton salir
Private Sub btnsalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnsalir.Click
Application.Exit()
End Sub

'Codigo en el boton Ingresar
Private Sub btningresar_Click(ByVal sender As System.Object, ByVal e AsHandles btningresar.Click
'Declaracion de variables para la coneccion, dataadapter,dataset
Dim texto As String
Dim cn As New SqlConnection
Dim da As SqlDataAdapter
Dim ds As New DataSet
'Variables usuario y contraseña , se le asigna el valos de las cajas de texto,y la variable activo, para ver si el usuario esta activo o no
Dim usuario As String
Dim password As String
usuario = Me.txtusuario.Text
password = Me.txtpassword.Text
Dim activo As String
'declaramos la conección
cn.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=DataDirectory \BDUSUARIOS.mdf;Integrated Security=True;User Instance=True"
'Try es para capturar los errores que puedan producirce la ejecucion del proceso
Try
'Crea el adaptador de datos, recuperando los datos de la tabla
texto = "SELECT * FROM USUARIOS WHERE usuario='" & usuario & "' and password='" & password & "'"
'Abrir la conección
cn.Open()
'ejecuto la consulta con el data adapter y lo guardo en la variable da
da = New SqlDataAdapter(texto, cn)
'Limpia el dataset
ds.Clear()
'Llena el Dataset con el data adapter
da.Fill(ds, "usuarios")
'Cuenta los registros del datatable si es igual a 0
If ds.Tables("usuarios").Rows.Count() = 0 Then
'Si no existe el usuario o contraseña verifica cuantas veces a intentado ingresar
If opcion = 3 Then
MessageBox.Show("A Perdido la Oportunidad de Ingresar", "Sistema", MessageBoxButtons.OK, MessageBoxIcon.Stop)
Me.Close()
End If
MessageBox.Show("Usuario o Contraseña Incorrecta", "Sistema", MessageBoxButtons.OK, MessageBoxIcon.Error)
Me.txtusuario.Text = ""
Me.txtpassword.Text = ""
Me.txtusuario.Focus()
'Agrega uno mas a la opcion de ingresar
opcion += 1
Else
'ver si el usuario esta activo, busca datos en el datatable
activo = ds.Tables("usuarios").Rows(0)(4)
If activo <> 1 Then
MessageBox.Show("Usuario Inactivo", "Sistema", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
'pasa los valores del datatable, el usuario y nivel de usuario
nivel = ds.Tables("usuarios").Rows(0)(0)
usuariov = ds.Tables("usuarios").Rows(0)(2)
MessageBox.Show("Bienvenido al sistema", "Sistema", MessageBoxButtons.OK, MessageBoxIcon.Information)
Dim f1 As New frmprincipal
Me.Hide()
f1.Show()
End If
End If
Catch ex As Exception
'captura si ocurre una error en la operación
MsgBox(ex.ToString)
End Try

End Sub
End Class

bien ya esta la entrada al sistema, ahora vamos a bloquear las opciones segun el nivel de usuario:

Public Class frmprincipal
Private Sub frmprincipal_FormClosing(ByVal sender As Object, ByVal e AsHandles Me.FormClosing
System.Windows.Forms.FormClosingEventArgs) 'al momento de cerrar la ventana cierra toda la aplicacion
Application.Exit()
End Sub

Private Sub frmprincipal_Load(ByVal sender As System.Object, ByVal e As Handles MyBase.Load
System.EventArgs) 'Pasa los datos de la variable usuariov a el label de la barra de estado
Me.ToolStripStatusLabel1.Text = "USUARIO---->" + usuariov

If nivel = 2 Then
'si es mienbro bloquear menu Administrador
AdministradorToolStripMenuItem.Enabled = False
ElseIf nivel = 3 Then
'si es invitado bloquear el menu Administrador y Mienbro
AdministradorToolStripMenuItem.Enabled = False
MienbroToolStripMenuItem.Enabled = False
Else
Exit Sub
End If
End Sub
End Class

ok con esto termino este blog , espero que les haya servido, mas adelante estare publicando nuevos manuales para ayudar los estudiantes el manejo de herraminetas de programacion.

para alguna duda o consulta = julio_06_20@hotmail.com

Loarte Huerto Julio

19 comentarios:

Anónimo dijo...

Hola.. de verdad muy bueno el articulo.. spero q subas mas...

gracias

Zanthino dijo...

La verdad es un articulo muy interesante ya que ami me interesa mucho
sobre le tema de programacion en Visual Studio.Net, que bien, sigue subiendo mas articulos. otra duda que tengo no se si me puedas ayudar es como se utiliza paginas maetras en Visual studio 2005. felicidades muy buen contenido
me ayudao bastante

Cesar López dijo...

Hola, realmente el tuto parece bueno, pero no me funciona, me sale el siguiente error:

System.Data.SqlClient.SqlException:
Error al intentar adjuntar una base de datos nombrada automáticamente para el archivo DataDirectory/BDUSUARIOS.mdf ya existe una base de datos con el mismo nombre, no se puede abrir el archivo especificado o se encuentra en un recurso compartido UNC.

Me sale esto entre otro chorro de lineas que no entiendo y al final muestra una linea de error, porfavor diganme que pasa con este tutorial. Gracias.

Kannalla dijo...

Cesar López ----> esta solucion va para ti !!! estuve viendo cual era el problema y pude conectarme a la base de datos... ten mucho OJO de donde esta almacenado tu base de datos. pq eso influye en la direccion que le pones al hacer la coneccion.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIngresar.Click
' declaracion de variables para la coneccion, dataadaptaer,dataset
Dim texto As String
Dim cn As New SqlConnection
Dim da As SqlDataAdapter
Dim ds As New DataSet

'variables usuario y contraseña, se le asigna el valor de las cadas de texto,
' y la variable activo, para ver si el usuario esta activo o no
Dim usuario As String
Dim clave As String

usuario = Me.txtnombre.Text
clave = Me.txtclave.Text

'Dim activo As String

'declarar la coneccion
cn.ConnectionString = "server=.\SQLEXPRESS; AttachDbFilename=C:\Documents and Settings\Huachi\Escritorio\auditoria V.2.0\Auditoria de impresion\BDIMPRESION.mdf;database = usuario; trusted_connection = yes;Integrated Security = True; User Instance=True"
'try para capturar los errores que puedan producirse la ejecucion del proceso
Try
'crea el adaptador de datos , recuperando los datos de la tabla
texto = "SELECT * FROM USUARIOS WHERE usuario ='" & usuario & "' and clave='" & clave & "'"
'abrimos la coneccion
cn.Open()
'ejecutamos la consulta con el data adapter y lo guardo en la variable da
da = New SqlDataAdapter(texto, cn)
'limpiamos el dataset
ds.Clear()
'llenamos el dataset con el data adapter
da.Fill(ds, "usuarios")
' cuenta los registros del datatable si es igual a 0
If ds.Tables("usuarios").Rows.Count() = 0 Then
'si no existe el usuario o contraseña verifica cuantas veces a intentado ingresar
If tipo = 3 Then
MessageBox.Show("A perdido la oportunidad de ingresar", "sistema", MessageBoxButtons.OK, MessageBoxIcon.Stop)
Me.Close()
End If
MessageBox.Show("Usuario o Contraseña Incorrecta", "sistema", MessageBoxButtons.OK, MessageBoxIcon.Error)
Me.txtnombre.Text = ""
Me.txtclave.Text = ""
Me.txtnombre.Focus()
'agrega uno mas a la opcion ingresar
tipo += 1
Else
'ver si el usuario esta activo, busca datos en el datatable
'activo = ds.Tables("usuarios").Rows(0)(3)
'If activo <> 1 Then
'MessageBox.Show("Usuario Inactivo", "Sistema", MessageBoxButtons.OK, MessageBoxIcon.Information)
'Else
'pasa los valores del datatable, el usuario y nivel de usuario
' nivel = ds.Tables("usuarios").Rows(0)(0)
' usuariov = ds.Tables("usuarios").Rows(0)(2)

MessageBox.Show("Bienvenido al sistema", "Sistema", MessageBoxButtons.OK, MessageBoxIcon.Information)
Dim f1 As New frmprincipal
Me.Hide()
f1.Show()
End If
'End If
Catch ex As Exception
' capturo si ocurre un error en la operacion
MsgBox(ex.ToString)
End Try
End Sub

Joao dijo...

hola . mi nombre ese joao ,, la verdad te agradesco por el codigo , me sirvio en gran canidad s no lo hallaba , eres un tigger ,a mi me gusta programar en visual basic.neet , vot aprendiendo html y javaweb, weno suerte haber si me agregocomo fans de tu blog y te pongo n el mio como referencia ok. suerte un abraso
JOFOX

Juanfe dijo...

Julio, necesito ayuda con un codigo en Visual Studio 2005, lo que pasa es que yo estoy desarrollando un programa de eleccion de personeros en un colegio, y necesito validar que un usuario no inicie secion 2 veces, yo le puse un nuevo campo a la tabla usuario llamada voto, que esta inicializada en 0, lo que yo quiero es que cuando el usuario inicie secion (ingresando su usuario y contraseña) el sistema inmediatamente me actualize ese voto y lo coloque en 1. Pero no se como hacerlo.. he intentado de varias formas pero nada, t mando el codigo para que mires a ver que puedo hacer.. Gracias por la Atencion Prestada!

nivel = ds.Tables("usuario").Rows(0)(6)
voto = ds.Tables("usuario").Rows(0)(7)
If voto = 1 Then

MessageBox.Show("Usted ya ha votado", "Sistema", MessageBoxButtons.OK, MessageBoxIcon.Stop)

Else
voto = ds.Tables("usuario").Rows(0)(7)
If nivel <> 1 Then
'consulta = ("update usuario set voto = 1 where codigo_usu = '" & Me.TextBox2.Text & "'")
'orden = New SqlCommand(consulta, cn)
'orden.Parameters.Add(New SqlParameter("@codigo_usu", SqlDbType.Int))
Actualizar.CommandText = "update usuario set voto = 1 where codigo_usu = '" & Me.TextBox2.Text & "'"
orden = New SqlCommand(Actualizar.CommandText, cn)
Actualizar.UpdatedRowSource = UpdateRowSource.OutputParameters
Actualizar.Connection = cn
MessageBox.Show("Bienvenido al tarjeton de elecciones", "sistema", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Dim pl As New Plantilla
pl.Show()
Else

usuariov = ds.Tables("usuario").Rows(0)(2)
MessageBox.Show("Bienvenido al sistema para administrador", "sistema", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Dim pr As New Principal
pr.Show()

End If

alberto galue dijo...

alguien podria ayudarme e adaptado este ejemplo poco a poco a lo que necesito pero el dilema es que quiero que lo haga con numeros de cedula y que este segun el nivel me lleve a un formulario u otro ejemplo un estudiante llevaria a un formulario donde veria solo su informacion y un profesor lo llevaria a un formulario donde introduciria su usuario y contraseña (osea el inicio de este toturial) me gustaria quien pudiera ayudarme que codigo debo de agregar y donde que segun el nivel me lleve a un formulario diferente

dark dijo...

La verdad esto:
activo = s.Tables("usuarios").Rows(0)(4)

If activo <> 1 Then...

Para mi está mal. El usuario se debería manejar directamente desde los roles de la base de datos y darle acceso solo si su estado no es bloqueado(Lock), ya que manejando seguridad contra una tabla creada por el usuario, deja demasiados huecos en la seguridad del sistema.

Supongo que en el conection string hace el login con un usuario generico, cosa que está mal, debería hacerse el login con los datos de acceso creados para determinado usuario en la tablas syslogins de la base de datos.

yeyo dijo...

El tuto esta buenisimo, pero me aparece error Warning 1 Variable 'conexion' is used before it has been assigned a value. A null reference exception could result at runtime.
Pero no lo he podido arreglar. Alguien me puede ayudar??? gracias

JokkerMX dijo...

HOla sabes te debo felicitar por tu codigo es muy bueno, pero sabes me arroja un error en la parte del load

Me.ToolStripStatusLabel1.Text = "USUARIO---->" + usuariov
If nivel = 2 Then
'si es mienbro bloquear menu Administrador
AdministradorToolStripMenuItem.Enabled = False
ElseIf nivel = 3 Then
'si es invitado bloquear el menu Administrador y Mienbro
AdministradorToolStripMenuItem.Enabled = False
MienbroToolStripMenuItem.Enabled = False
Else
Exit Sub
End If


La conversión de la cadena "nombre de usuario " en el tipo 'Double' no es válida.

Anónimo dijo...

muy bueno, me sirvió de mucho gracias!!!

Anónimo dijo...

hola necesito ayuda porfavor tengo una tabla en SQL 2000 llamada usuario con los siguientes campos: Usuario,Clave y tipo en tipo guardo si el usuario es administrador o usuario, la cuestion es que no se como limitar el acceso a los usuaros y darle todo los permisos al administrador, este programa lo estoy haciendo en VB.NET 2005, si alguien puede ayudarme le estaria muy agradesido.

jhan carlos cabrera dijo...

hola soy nuevo en visual basic y tengo un error aber si me puedes ayudar. mira este es:
FormsClosingEventArgs no es un mienbro de forms.

kinety1 dijo...

noentendi eso de que pulique a nivel modulo, justo al inicio del codigo

kinety1 dijo...

noentendi eso de que pulique a nivel modulo, justo al inicio del codigo

Anónimo dijo...

Julio,... Me podrias ayudar deseo que el nombre de la persona que entre a mi sistema sea el admistrador o invitado me aparezca en la barra de titulo de mi form ... Yo tengo esto me sale la hora y la fecha de inicio de entrada pero como coloco el label que me captura la persona que entre a mi sistema en la barra de titulo para colocar
Me.Text = " Aplicacion.Net - Sesión iniciada Por :" + " " + "el dia " + Now.ToLongDateString + " " + TimeOfDay

Unknown dijo...

Buenas noches Amigo Loarte, disculpe que lo moleste, logre implementar el ejemplo de validar Usuario y Contraseña. ahora la pregunta es!! después de que inicia el Formulario Principal MDI q hago? tengo el proyecto que quisiera asignarle a este ejemplo y no se como adjuntarlo.

AHHH el formulario MDI se inicia en gris como en la foto que usted adjunta.

Otra pregunta? es posible cambiar los Usuarios y contraseñas después de compilar esta aplicación?

Anónimo dijo...

Hola, si el usuario intenta 3 veces y es error como bloqueas al usuario? si activo es tipo bit 1/0 o true/false, como bloqueas al usuario luego que ha intentado 3 veces sin poder entrar?

Mi Internet dijo...

Me gusta la explicación paso a paso.
Esta bueno el aporte.