viernes, 1 de junio de 2018

Access Formulario de Login (V) Login v.1.3


En el capítulo de hoy, vamos a ver como desarrollar un sistema de seguridad básico para el control de los intentos erróneos de iniciar sesión. ¿Que quiere decir esto? Pues en la práctica, que un usuario “x” podría indicar un máximo de n intentos de iniciar sesión con una contraseña errónea antes de ser bloqueado y no poder iniciar sesión en la aplicación.
Y… ¿Por qué es interesante desarrollar algo parecido a lo que propongo? Pues básicamente por cuestiones de seguridad, dependiendo de que tipo de datos queramos almacenar en nuestra BBDD, deberemos exigir un nivel mas alto o mas bajo de seguridad. Claro que es un sistema de seguridad un tanto básico, pero claro, TODO SUMA. Simplemente es ir añadiendo capas de seguridad a nuestra aplicación.
Para llevar a cabo esta modificación en nuestro formulario de Login, vamos a crear un módulo estándar donde copiaremos el procedimiento que se encargará de bloquear a los usuarios en caso de sobrepasar los n intentos fallidos de iniciar sesión en la aplicación. Y realizar unas modificaciones en el módulo del formulario para controlar el número de intentos fallidos al iniciar sesión.
Creo que no hay mucho mas que explicar. Así que vamos al lío…

Paso 1

El primer paso, será crear un módulo estándar, que guardaremos con el nombre “bas_Seguridad_Sesion”. En el, copiaremos el siguiente procedimiento:

Public Sub Block_Usuario(intUsuario As Integer)
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String
    strSQL = "SELECT dbo_Usuarios.Activo " & _
                "FROM dbo_Usuarios " & _
                "WHERE ID_Usuario = " & intUsuario & ";"
                
    Set dbs = CurrentDb()
    Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
    With rst
        
        ' Modificamos el registro
        .Edit
        .Fields("Activo").Value = False
        ' Actualizamos el registro
        .Update
    
    End With
    
    ' Cerramos el recordset
    rst.Close
    ' Borramos los objetos
    Set rst = Nothing
    Set dbs = Nothing
End Sub
Este procedimiento, lo que va a hacer, es bloquear al usuario definido en el argumento pasado al procedimiento. Con lo cual, dicho usuario ya no aparecería en el combobox (desplegable) para su selección como usuario que puede iniciar sesión en la aplicación.

Paso 2

El siguiente paso, es agregar una variable con la que controlar el número de intentos fallidos de iniciar sesión y una constante que indicará el número máximo de intentos fallidos que dispone el usuario antes de ser bloqueado. La variable y la constante, las colocaremos en la cabecera del módulo del formulario.
Quedando de la siguiente manera…
Option Compare Database
Option Explicit
' Variable privada que controla los intentos de login fallidos
Private bytErrLogin As Byte
' Constante que almacena el número máximo de intentos fallidos
Private Const bytErrLoginMax As Byte = 3
Si analizamos un poco el código, vemos que:
  • La variable que va a controlar el número de intentos se llama bytErrLogin de tipo byte.
  • La constante que controla el número máximo de intentos, se llama bytErrLoginMax también de tipo byte y con un valor establecido de 3.

Paso 3

Ahora nos toca modificar el código del evento “Load” del formulario de login. Para iniciar la variable del controlador de intentos fallidos de inicio de sesión de usuario.

Private Sub Form_Load()
    
    ' Establecemos el valor de la variable que controla los
    ' errores de login...
    bytErrLogin = 0
    
End Sub
Escribiendo estas líneas de código en el evento Load del formulario, establecemos en “0” el contador de inicios de sesión fallidos, con lo que cada vez se cierre y se vuelva a abrir el formulario el contador se pone a 0.

Paso 4

Lo siguiente que vamos a hacer, es crear un procedimiento para comprobar si el número de intentos fallidos de iniciar sesión, es igual al número máximo de intentos fallidos establecido en la constante bytErrLoginMax.

Private Sub Comprueba_Intentos(bytErrLogin As Byte, _
                                intUsuario As Integer)
    If bytErrLogin = bytErrLoginMax Then
        ' Mostramos el mensaje "Se ha superado el número máximo de intentos
        ' de inicio de sesión"
        MsgBox "Se ha superado el número máximo de intentos de " & _
                "inicio de sesión." & _
                vbCrLf & vbCrLf & _
                "Usuario : """ & Me.cbo_Usuario.Column(1) & """." & _
                vbCrLf & vbCrLf & _
                "El usuario ha sido bloqueado.", _
                vbExclamation, "Inicio de sesión"
            
        ' Bloqueamos al usuario
        Call Block_Usuario(intUsuario)
            
        ' Hacemos log del bloqueo del usuario
        Call Log_Sesion(intUsuario, "El usuario ha sido bloqueado.")
        
        With Me
        
            ' Actualizamos el combobox cbo_Usuario
            .cbo_Usuario.Requery
                
            ' Borramos la contraseña
            .txt_Password = ""
                
            ' Ocultamos la etiqueta
            .lbl_Mensaje.Visible = False
      
        End With
      
    End If
            
End Sub
Si los valores de bytErrLogin y de bytErrLoginMax son iguales :
  • Se mostrará un msgbox informando que el usuario x ha sido bloqueado por haber igualado el número máximo de intentos fallidos de iniciar una sesión de usuario.
  • Seguidamente, el procedimiento, llamará a la función Block_Usuario para bloquear dicho usuario.
  • Y por último, el procedimiento, llamará a la función Log_Session para insertar un registro en la tabla dbo_Log_Sesion con el mensaje “El usuario ha sido bloqueado”.

Paso 5

Habiendo creado ya el procedimiento para bloquear el usuario que exceda el número máximo de intentos fallidos de iniciar una sesión de usuario en nuestra aplicación, el procedimiento que controlará el número de intentos fallidos. Toca modificar el código del evento Click del botón Login.

Private Sub cmd_Login_Click()
Dim intUsuario As Integer
Dim strContraseña As String
    intUsuario = Nz(Me.cbo_Usuario.Value, 0)
    strContraseña = Nz(Me.txt_Password, "")
    
    ' Ocultamos la etiqueta
    If Me.lbl_Mensaje.Visible = True Then Me.lbl_Mensaje.Visible = False
    
    ' Comprobamos si se ha seleccionado usuario
    If Comprueba_Usuario = False Then Exit Sub
    ' Comprobamos si se ha introducido contraseña
    If Comprueba_Contraseña = False Then Exit Sub
    ' Comprobamos el valor introducido para el usuario y su contraseña
    If Me.txt_Password = Get_Contraseña(intUsuario) Then
        ' -------------------------------------------------------
        ' Aquí podemos insertar el código que queremos que se
        ' ejecute cuando iniciemos la sesión...
        ' -------------------------------------------------------
            
        ' Mostramos mensaje
        MsgBox "Sesión de usuario iniciada", _
                vbInformation, _
                "Inicio de Sesión"
        ' Hacemos log del inicio de sesión
        Log_Sesion intUsuario, "Inicio de sesión."
        ' Cerramos el formulario
        DoCmd.Close acForm, Me.Name
            
    Else
        
        ' Añadimos +1 a los intentos de login erróneos
        intErrLogin = intErrLogin + 1
        
        ' Centramos el foco en el textbox
        Me.txt_Password.SetFocus
        ' Mostramos mensaje en la etiqueta
        Call MensajeEtiqueta("La contraseña introducida es errónea.")
        
        ' Hacemos log del inicio de sesión fallido
        Call Log_Sesion(intUsuario, "Inicio de sesión erróneo.", strContraseña)
        ' Comprobamos los intentos de inicio de sesión
        Call Comprueba_Intentos(intErrLogin, intUsuario)
        
    End If
    
End Sub
Si os fijáis, únicamente hemos añadido el siguiente código al evento cmd_Login_Click para controlar los intentos fallidos de inciar sesión.
' Comprobamos los intentos de inicio de sesión
        Call Comprueba_Intentos(intErrLogin, intUsuario)
Pero, ¿Cual es el resultado de todo esto? Pues en las imágenes podéis ver el resultado…
En la tabla dbo_Log_Sesion, la inserción de 4 registros, uno por cada uno de los intentos fallidos de iniciar sesión, y un cuarto para informar que el usuario ha sido bloqueado.






No hay comentarios.:

Publicar un comentario