SoloCodigo

Programación General => Visual Basic 6.0 e inferiores => Mensaje iniciado por: bailat62 en Jueves 23 de Septiembre de 2010, 13:21

Título: Log in Visual Basic
Publicado por: bailat62 en Jueves 23 de Septiembre de 2010, 13:21
--------------------------------------------------------------------------------

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:
Título: Re: Log in Visual Basic SOLUCIONADO!!!!
Publicado por: bailat62 en Sábado 25 de Septiembre de 2010, 06:18
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.
Título: Re: Log in Visual Basic
Publicado por: cuentavarios en Domingo 24 de Abril de 2011, 03:22
No esta mal el ejemplo, pero esta enfocado a usuarios con pocos conocimientos y los puedes inducir a dos fallos de seguridad:
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.
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" & ";"