Programación General > Visual Basic 6.0 e inferiores
Log in Visual Basic
(1/1)
bailat62:
--------------------------------------------------------------------------------
Hola a todos, ante todo soy aficionado de Visual Basic, y mis limitaciones en este tema son importantes, ja ja: este codigo funciona perfectamente, para log_in, sucede que estoy desarrollando un ejecutable y necesito MODIFICAR este CODIGO para segun quien entra derivarlo a distintos formularios, ej form1, form2, . . . form8, solamente hay 8 usuarios registrados, desde ya muchas gracias...
Miguel
frmLogin:
Option Explicit
' Flag
Dim Ok As Boolean
Private Sub cmdEntrar_Click()
' Cadena de conexión ( INDICAR EL PATH DE LA BASE DE DATOS )
Const C_CADENA = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & "C:Bd_MEJORASdatabdMejoras.mdb" & ";"
' Variable para el recordset
Dim Rst_Login As Recordset
' crea el recordset
Set Rst_Login = New Recordset
Dim SQL As String
' consulta SQL ( Campos: Nombre y Password) _
Textbox ( txt_Usuario y txt_Password) _
Tabla: Usuarios
SQL = "SELECT Nombre, Password " & _
"FROM Usuarios " & _
"WHERE Nombre = '" & txt_Nombre.Text & "'" _
& "AND Password = '" & txt_Password.Text & "'"
With Rst_Login
' Abre el recordset
.Open SQL, C_CADENA
' Si el recordset está vacío es por que es incorrecto
If .EOF Then
MsgBox " El usuario o Password es incorrecto ", _
vbCritical, " Login incorrecto "
' Cierra y descarga el Recordset
Rst_Login.Close
Set Rst_Login = Nothing
Exit Sub
End If
End With
' Cierra y descarga el Recordset
Rst_Login.Close
Set Rst_Login = Nothing
'Cambia el Flag para que no cierre el programa con End
Ok = True
' Descarga el formulario y prosigue en el SubMain
Unload Me
End Sub
Private Sub cmdSalir_Click()
Ok = False
Unload Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set frmLogin = Nothing
If Ok = False Then
End
End If
End Sub
frmSubMain:
Option Explicit
Public Sub Main()
Dim Nombre As Variant
Dim dario As Variant
Dim edith As Variant
Dim txt_Nombre As Variant
' Abre el formulario para el ingreso _
del Usuario y la contraseña
frmLogin.Show vbModal
MsgBox " ..bienvenido al sistema de tickets ", vbInformation, " Login Correcto "
' Abre el formulario principal del programa
frmPrinc1.Show
End Sub :hitcomp:
bailat62:
FUNCIONA 10 PUNTOS, ESTA PROBADO, FALTARIA SOLAMENTE PARA QUE QUEDE BIEN PROFECIONAL UN REGISTRO DE PASSWORD
OJALA LE SIRVA A ALGUIEN
SALÑUDOS
MIGUEL, BS AS, ARGENTINA !!
------------------------
Option Explicit
Public conn As ADODB.Connection
Public Sub Connection()
Dim Path_BD As String
Path_BD = "C:Bd_MEJORASdatabdMejoras.mdb"
Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Path_BD & ";" & _
"Mode=ReadWrite|Share Deny None;" & _
"Persist Security Info=False;Jet OLEDB"
conn.Open Path_BD
End Sub
Ok una vez que tenemos nuestra conexion la tendremos disponible en cual quier parte del proyecto con una simple llamada "Call Connection" sin comillas. El segundo paso sera crear nuestro recordset para realizar la consulta! Para esto dentro de tu FORM del LOGIN agregamos esto...
Option Explicit
Dim Rst_Login As ADODB.Recordset
Dim iLoginFailure As Integer 'Esta variable llevara el conteo de cuantas veces 'intentara el usuario entrar al sistema
Private Sub Form_Initialize()
Call Connection 'Llamas tu conexion a la BD
Set Rst_Login = New ADODB.Recordset 'Creas tu RecordSet
With Rst_Login
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.ActiveConnection = conn 'Ligas tu RecordSet con la BD para sentencia
.CursorLocation = adUseClient
End With
iLoginFailure = 1
End Sub
Perfecto vamos bien espero que hasta aqui no tengas alguna duda! Ahora continuemos con la sentencia Sql para logear a tus Usuarios... Dentro de un CommandButton Agregas este codigo... (en mi caso el button se llama cmdGO_Click)
Private Sub cmdGO_Click()
On Error GoTo Indice
If iLoginFailure <= 3 Then 'Recuerdas la variable del conteo para intentos?
Rst_Login.Open "select * from Usuarios where Nombre='" & txt_Nombre.Text & "'", conn
With Rst_Login 'A partir de aqui verificamos si existe el Usuario
If .RecordCount = 0 Then
iLoginFailure = iLoginFailure + 1 'Se incrementa la variable
MsgBox "Nombre De Usuario No Valido! Por Favor Intente Otra Vez!", vbCritical, "Login No Vàlido!"
txt_Nombre.BackColor = &H80000018
txt_Password.BackColor = &H80000005
txt_Nombre.Text = ""
txt_Nombre.SetFocus
End If
If .RecordCount <> 0 Then 'Si el nombre existe entonces ahora verifica el password
If txt_Password.Text = .Fields(6).Value Then 'Aca verifico si lo que se escribio en el text es igual a lo que esta en la tabla, en mi caso el campo esta en la posicion numero (6) solo verifica en que posicion esta en la tuya recuerdas que el conteo inicia desde 0 o lo puedes poner tambien asi .Fields("Password"), si el pass es correcto entonces entra a la siguiente condicion.
If .Fields(4) = "Administrador" Then ' esta es la parte donde los vas a direccionar a sus FORMS correspondientes, depende el "Level" que hatas puesto, en mi caso la posiocion del campo "Level" esta en el (4)
frmMDI.Show
Unload Me
ElseIf .Fields(4) = "Limitado" Then
frmLimitado.Show
Unload Me
frmMDI.Show
ElseIf .Fields(4) = "Staff" Then
frmStaff.Show
Unload Me
ElseIf .Fields(4) = "Recepcion" Then
frmRecepcion.Show
Unload Me
ElseIf .Fields(4) = "Advanced" Then
frmAdvanced.Show
Unload Me
End If
Else
iLoginFailure = iLoginFailure + 1
MsgBox "Password No Valido! Por Favor Intente Otra Vez!", vbCritical, "Login No Vàlido!"
txt_Password.BackColor = &H80000018
txt_Nombre.BackColor = &H80000005
txt_Password.SetFocus
End If 'Cerramos condiciones
End If
.Close 'Cerramos tabla
End With
Else
MsgBox "Lo Siento! Tres Intentos Han Fallado! El Sistema Se Cerrara ...", vbCritical, "Login Fallido"
End
End If
Indice: 'Manipulamos errores
If Err.Number <> 0 Then
MsgBox Err.Number& & Err.Description, 16, "Error"
End If
End Sub 'termina el sub y listo.
cuentavarios:
No esta mal el ejemplo, pero esta enfocado a usuarios con pocos conocimientos y los puedes inducir a dos fallos de seguridad:
1º No se debe decir si lo que falla es el usuario o la contraseña, porque facilitamos el trabajo a quien quiera adivinar los datos de un usuario al que conoce. Son muchos los casos en los que los que trastean en nuestras aplicaciones son usuarios internos a nuestro entorno.
2º en las lineas siguientes estas facilitando que te hagan lo que se llama SQL Inyection:
SQL = "SELECT Nombre, Password " & _
"FROM Usuarios " & _
"WHERE Nombre = '" & txt_Nombre.Text & "'" _
& "AND Password = '" & txt_Password.Text & "'"
El motivo es que si introducen caracteres extraños en txt_Nombre.Text o txt_Password.Text pueden conseguir acceso al programa, o como minimo se producirán errores que probablemente no hayas previsto. Por ejemplo si alguien escribe un %.
Para solucionarlo hay que usar parametros, quedando algo parecido a lo siguiente:
SQL = "SELECT Nombre, Password " & _
"FROM Usuarios " & _
"WHERE Nombre = ? AND Password = ?"
cmdUsuario.CommandText = SQL
Set prmUsuario = cmdUsuario.CreateParameter("Nombre", adVarChar, adParamInput, 25, Trim( txt_Nombre.Text))
cmdUsuario.Parameters.Append prmUsuario
Set prmUsuario = cmdUsuario.CreateParameter("Clave", adVarChar, adParamInput, 25, Trim(txt_Password.Text))
cmdUsuario.Parameters.Append prmUsuario
Set Rst_Login= cmdUsuario.Execute()
Por ultimo un consejo, situa la base de datos en el mismo directorio de la aplicación o en un subdirectorio de este y usa como ruta app.path que devuelve la ruta donde estas ejecutando la aplicación.
Por ejemplo si la base de datos se llama bdMejoras.mdb y se encuentra en un subdirectorio de donde esta la aplicación llamado BD, sustituye
"Data Source=" & "C:Bd_MEJORASdatabdMejoras.mdb" & ";"
por
"Data Source=" & app.path & "BDbdMejoras.mdb" & ";"
Navegación
Ir a la versión completa