Repository navigation
Expand file tree
/
Copy pathdatabase_usuarios.sql
More file actions
215 lines (188 loc) · 8.48 KB
/
Copy pathdatabase_usuarios.sql
File metadata and controls
215 lines (188 loc) · 8.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
-- ============================================================
-- SISTEMA DE USUARIOS Y CONFIGURACIÓN
-- Ejecutar después de database.sql
-- ============================================================
USE escaner_red;
-- ============================================================
-- TABLA: Usuario
-- Usuarios del sistema
-- ============================================================
CREATE TABLE IF NOT EXISTS usuario (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE COMMENT 'Nombre de usuario único',
password_hash VARCHAR(255) NOT NULL COMMENT 'Contraseña hasheada con bcrypt',
nombre_completo VARCHAR(100) COMMENT 'Nombre completo del usuario',
rol ENUM('admin', 'operador', 'visor') DEFAULT 'operador' COMMENT 'Rol del usuario',
activo BOOLEAN DEFAULT TRUE COMMENT 'Usuario activo o desactivado',
ultimo_acceso TIMESTAMP NULL COMMENT 'Última fecha de acceso',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_username (username),
INDEX idx_rol (rol),
INDEX idx_activo (activo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- TABLA: Configuracion_Usuario
-- Configuración personalizada por usuario
-- ============================================================
CREATE TABLE IF NOT EXISTS configuracion_usuario (
id INT AUTO_INCREMENT PRIMARY KEY,
usuario_id INT NOT NULL UNIQUE,
red_escaneo VARCHAR(50) DEFAULT '192.168.1.0/24' COMMENT 'Red predeterminada a escanear',
timeout_ms INT DEFAULT 2000 COMMENT 'Timeout en milisegundos',
concurrencia INT DEFAULT 50 COMMENT 'Número de conexiones concurrentes',
escaneo_automatico BOOLEAN DEFAULT FALSE COMMENT 'Activar escaneo automático',
intervalo_escaneo INT DEFAULT 30 COMMENT 'Intervalo en minutos para escaneo automático',
alertas_activas BOOLEAN DEFAULT TRUE COMMENT 'Mostrar alertas de seguridad',
tema VARCHAR(20) DEFAULT 'dark' COMMENT 'Tema de la interfaz',
sidebar_colapsado BOOLEAN DEFAULT FALSE COMMENT 'Estado del sidebar',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (usuario_id) REFERENCES usuario(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- TABLA: Nombre_Dispositivo
-- Nombres personalizados de dispositivos por usuario
-- ============================================================
CREATE TABLE IF NOT EXISTS nombre_dispositivo (
id INT AUTO_INCREMENT PRIMARY KEY,
usuario_id INT NOT NULL,
equipo_id INT NOT NULL,
nombre_personalizado VARCHAR(100) NOT NULL COMMENT 'Nombre dado por el usuario',
descripcion TEXT COMMENT 'Descripción o notas del usuario',
icono VARCHAR(50) DEFAULT 'computer' COMMENT 'Icono personalizado',
color VARCHAR(20) DEFAULT '#3b82f6' COMMENT 'Color de identificación',
favorito BOOLEAN DEFAULT FALSE COMMENT 'Marcado como favorito',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY unique_usuario_equipo (usuario_id, equipo_id),
INDEX idx_usuario (usuario_id),
INDEX idx_equipo (equipo_id),
INDEX idx_favorito (favorito),
FOREIGN KEY (usuario_id) REFERENCES usuario(id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (equipo_id) REFERENCES equipo(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- TABLA: Sesion
-- Sesiones activas de usuarios
-- ============================================================
CREATE TABLE IF NOT EXISTS sesion (
id INT AUTO_INCREMENT PRIMARY KEY,
usuario_id INT NOT NULL,
token VARCHAR(255) NOT NULL UNIQUE COMMENT 'Token de sesión',
ip_address VARCHAR(45) COMMENT 'IP desde donde se conectó',
user_agent TEXT COMMENT 'Información del navegador',
expira_en TIMESTAMP NOT NULL COMMENT 'Fecha de expiración',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_token (token),
INDEX idx_usuario (usuario_id),
INDEX idx_expira (expira_en),
FOREIGN KEY (usuario_id) REFERENCES usuario(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- TABLA: Actividad_Usuario
-- Registro de actividad del usuario
-- ============================================================
CREATE TABLE IF NOT EXISTS actividad_usuario (
id INT AUTO_INCREMENT PRIMARY KEY,
usuario_id INT NOT NULL,
accion VARCHAR(100) NOT NULL COMMENT 'Tipo de acción realizada',
detalle TEXT COMMENT 'Detalles de la acción',
ip_address VARCHAR(45) COMMENT 'IP desde donde se realizó',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_usuario (usuario_id),
INDEX idx_accion (accion),
INDEX idx_fecha (created_at),
FOREIGN KEY (usuario_id) REFERENCES usuario(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- USUARIO ADMINISTRADOR POR DEFECTO
-- Contraseña: admin123 (hasheada con bcrypt)
-- ============================================================
INSERT INTO usuario (username, password_hash, nombre_completo, rol) VALUES
('admin', '$2b$10$rQZ8K.VXRqYQvQH3QH3QHuYIFQYHQYHQYHQYHQYHQYHQYHQYHQYHQ', 'Administrador', 'admin')
ON DUPLICATE KEY UPDATE nombre_completo = 'Administrador';
-- ============================================================
-- PROCEDIMIENTOS PARA USUARIOS
-- ============================================================
-- Procedimiento: Crear usuario con configuración inicial
DELIMITER //
CREATE PROCEDURE crear_usuario(
IN p_username VARCHAR(50),
IN p_password_hash VARCHAR(255),
IN p_nombre_completo VARCHAR(100),
IN p_rol VARCHAR(20),
OUT p_usuario_id INT,
OUT p_resultado VARCHAR(50),
OUT p_mensaje VARCHAR(255)
)
BEGIN
DECLARE v_existe INT DEFAULT 0;
-- Verificar si el usuario ya existe
SELECT COUNT(*) INTO v_existe FROM usuario WHERE username = p_username;
IF v_existe > 0 THEN
SET p_usuario_id = NULL;
SET p_resultado = 'ERROR';
SET p_mensaje = 'El nombre de usuario ya existe';
ELSE
-- Crear usuario
INSERT INTO usuario (username, password_hash, nombre_completo, rol)
VALUES (p_username, p_password_hash, p_nombre_completo, COALESCE(p_rol, 'operador'));
SET p_usuario_id = LAST_INSERT_ID();
-- Crear configuración inicial
INSERT INTO configuracion_usuario (usuario_id) VALUES (p_usuario_id);
SET p_resultado = 'CREADO';
SET p_mensaje = CONCAT('Usuario ', p_username, ' creado correctamente');
END IF;
END //
DELIMITER ;
-- Procedimiento: Actualizar último acceso
DELIMITER //
CREATE PROCEDURE actualizar_ultimo_acceso(IN p_usuario_id INT)
BEGIN
UPDATE usuario SET ultimo_acceso = CURRENT_TIMESTAMP WHERE id = p_usuario_id;
END //
DELIMITER ;
-- Procedimiento: Registrar actividad
DELIMITER //
CREATE PROCEDURE registrar_actividad(
IN p_usuario_id INT,
IN p_accion VARCHAR(100),
IN p_detalle TEXT,
IN p_ip VARCHAR(45)
)
BEGIN
INSERT INTO actividad_usuario (usuario_id, accion, detalle, ip_address)
VALUES (p_usuario_id, p_accion, p_detalle, p_ip);
END //
DELIMITER ;
-- Procedimiento: Limpiar sesiones expiradas
DELIMITER //
CREATE PROCEDURE limpiar_sesiones_expiradas()
BEGIN
DELETE FROM sesion WHERE expira_en < CURRENT_TIMESTAMP;
END //
DELIMITER ;
-- ============================================================
-- VISTA: Equipos con nombres personalizados por usuario
-- ============================================================
CREATE OR REPLACE VIEW vista_equipos_usuario AS
SELECT
e.id AS equipo_id,
e.hostname,
e.direccion_ip,
e.mac_address,
f.nombre AS fabricante,
e.sistema_operativo,
e.tipo_dispositivo,
e.estado,
e.ultima_deteccion,
nd.usuario_id,
nd.nombre_personalizado,
nd.descripcion AS descripcion_usuario,
nd.icono,
nd.color,
nd.favorito
FROM equipo e
LEFT JOIN fabricante f ON e.fabricante_id = f.id
LEFT JOIN nombre_dispositivo nd ON e.id = nd.equipo_id;