Entrada 10 (sp_Login)

  Fecha: 23/04/2026 y 24/04/2026

Inicio: [23:47] del 23 | Fin: [01:06] del 24 || Total: [1 hora y 19 minutos]

Presentes: Sebastián Ramírez Abarca

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
¿QUÉ HICIMOS HOY?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Se avanzó con los store procedures, específicamente con sp_Login
Corrección en los estándares en sp_UpdateEmpleado y sp_GetEmpleadoById.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PROBLEMAS ENCONTRADOS Y CÓMO SE RESOLVIERON
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
No se encontraron errores de sintaxis y el SP aún no está conectado para probarlo.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
DUDAS Y DIVERGENCIAS DE CRITERIO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. Surgió la duda de qué hacer cuando se ingresa un username inexistente: no tiene sentido guardar intentos pues no hay usuario seleccionado para contarlos.
Se decidió que provisionalmente no se guarde en BitacoraEvento y solo devuelve un código de error.
2. Debido a que en este sesión solo partició una persona no hubo divergencias.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
AVANCE DEL CÓDIGO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
sp_Login:
USE VacacionesDB;
GO

-- =====================================================
-- SP: Login de usuario
-- =====================================================
DROP PROCEDURE IF EXISTS sp_Login;
GO

CREATE PROCEDURE sp_Login
    @inUsername VARCHAR(128),
    @inPassword VARCHAR(128),
    @inIpPostIn VARCHAR(64),
    @inPostTime DATETIME,
    @outResultCode INT OUTPUT
AS
BEGIN

    SET NOCOUNT ON;

    DECLARE @idUsuario INT,
        @password VARCHAR(128),
        @idTipoEventoSuccess INT,
        @idTipoEventoFail INT,
        @idTipoEventoDisabled INT,
        @intentosFallidos INT,
        @descripcion VARCHAR(512)

        SET @outResultCode = 0;

    BEGIN TRY
           
        SELECT @idTipoEventoSuccess = t.id
        FROM dbo.TipoEvento t
        WHERE t.Nombre = 'Login Exitoso';

        SELECT @idTipoEventoFail = t.id
        FROM dbo.TipoEvento t
        WHERE t.Nombre = 'Login No Exitoso';

        SELECT @idTipoEventoDisabled = t.id
        FROM dbo.TipoEvento t
        WHERE t.Nombre = 'Login deshabilitado';

        -- Obtener datos del usuario
        -- @idUsuario y @password serán NULL si no existe @inUsername en la BD
        SELECT @idUsuario = u.id, @password = u.password
        FROM dbo.Usuario u
        WHERE u.Username = @inUsername;

        -- Verificar que existe usuario
        IF @idUsuario IS NULL
        BEGIN
            SET @outResultCode = 50001;
            RETURN;
        END

        -- Contar intentos fallidos en los ultimos 20 min
        SELECT @intentosFallidos = COUNT(*)
        FROM dbo.BitacoraEvento b
        WHERE b.idTipoEvento = @idTipoEventoFail
            AND b.idUsuario = @idUsuario
            AND b.IpPostIn = @inIpPostIn
            AND b.PostTime >= DATEADD(MINUTE, -20, @inPostTime);

        IF @intentosFallidos >= 5
        BEGIN
            SET @outResultCode = 50003;

            INSERT INTO dbo.BitacoraEvento (idTipoEvento, Descripcion, idUsuario, IpPostIn, PostTime)
            VALUES (@idTipoEventoDisabled, NULL, @idUsuario, @inIpPostIn, @inPostTime)

            RETURN;
        END

        -- Verficar password
        IF @password <> @inPassword
        BEGIN
            SET @outResultCode = 50002;

            SET @descripcion = 'Intento: ' + CAST(@intentosFallidos + 1 AS VARCHAR(10))
                + ' | Error: ' + (SELECT Descripcion FROM dbo.Error WHERE Codigo = 50002);

            INSERT INTO dbo.BitacoraEvento (idTipoEvento, Descripcion, idUsuario, IpPostIn, PostTime)
            VALUES (@idTipoEventoFail, @descripcion, @idUsuario, @inIpPostIn, @inPostTime);

            RETURN;
        END

        -- Login exitoso
        INSERT INTO BitacoraEvento (idTipoEvento, Descripcion, idUsuario, IpPostIn, PostTime)
        VALUES (@idTipoEventoSuccess, 'Exitoso', @idUsuario, @inIpPostIn, @inPostTime);

        SET @outResultCode = 0;
       
    END TRY
    BEGIN CATCH
       
        INSERT INTO DBError (UserName, Number, State, Severity, Line, [Procedure], Message, DateTime)
        VALUES (
            SYSTEM_USER,
            ERROR_NUMBER(),
            CAST(ERROR_STATE()    AS VARCHAR(32)),
            CAST(ERROR_SEVERITY() AS VARCHAR(32)),
            ERROR_LINE(),
            ISNULL(ERROR_PROCEDURE(), 'sp_Login'),
            ERROR_MESSAGE(),
            GETDATE()
        );

        SET @outResultCode = 50008;

    END CATCH
END;
GO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
MORALEJAS / BUENAS PRÁCTICAS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. Hoy no se implementaron nuevas para esta sección.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PRÓXIMA SESIÓN: ¿QUÉ SIGUE?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- Realizar sp_Logout

Comentarios

Entradas más populares de este blog

Entrada 16 (Controlador de movimientos)

Entrada 20 (Lógica de insertarMovimientos, conectarla y probarla)

Entrada 21 (Análisis de resultados)