Autenticación y Roles
Sistema de Roles
Roles Disponibles
CAPI App define tres roles principales:
- Doctor - Profesional de la salud
- Variante: Doctor Admin (
isAdmin: true)
- Variante: Doctor Admin (
- Paciente - Usuario paciente
- Asistente - Asistente de clínica
Estructura de Roles
class="highlight">
1
2
3
4
5
enum Roles {
Doctor,
Asistente,
Paciente,
}
Lógica de Roles
Importante: Un administrador de clínica es un Doctor con isAdmin: true.
- Todos los administradores tienen:
role: "Doctor" + isAdmin: true - Un doctor regular tiene:
role: "Doctor" + isAdmin: false - El campo
role nunca debe ser “Administrador”
Sistema de Permisos
Permisos Granulares
El sistema incluye 15+ permisos específicos:
class="highlight">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PermisosStruct {
verCitas: bool
crearCitas: bool
editarCitas: bool
eliminarCitas: bool
verPacientes: bool
crearPacientes: bool
editarPacientes: bool
verConsultas: bool
crearConsultas: bool
editarConsultas: bool
verEquipo: bool
gestionarEquipo: bool
verServicios: bool
gestionarServicios: bool
configurarClinica: bool
todos: bool // Permiso maestro
}
Validación de Permisos
En el Frontend
class="highlight">1
2
3
4
5
import '/services/permissions_validator.dart';
if (PermissionsValidator.hasPermission('crearCitas')) {
// Mostrar botón de crear cita
}
En Firestore Rules
class="highlight">1
2
3
4
5
6
function hasPermission(permission) {
return isAuthenticated() &&
(getCurrentUser().isAdmin == true ||
getCurrentUser().permisos.todos == true ||
getCurrentUser().permisos[permission] == true);
}
Control de Acceso
Por Rol
class="highlight">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch (userRole) {
case 'Doctor':
if (isAdmin) {
// Acceso completo a la clínica
} else {
// Solo sus propias citas/consultas
}
break;
case 'Paciente':
// Solo sus propios datos
break;
case 'Asistente':
// Según permisos asignados
break;
}
Por Clínica
Todas las operaciones validan pertenencia a clínica:
class="highlight">1
2
3
if (cita.clinica?.id != currentUser.clinica?.id) {
// Acceso denegado
}
Por Permisos Específicos
class="highlight">1
2
3
if (!PermissionsValidator.hasPermission('editarCitas')) {
// Mostrar AccessDeniedWidget
}
Flujo de Autenticación
Registro
- Usuario completa formulario de registro
- Se crea cuenta en Firebase Auth
- Se crea
UsersRecord en Firestore - Se asigna rol inicial
- Si es Doctor Admin, se crea clínica automáticamente
Login
- Usuario ingresa credenciales
- Firebase Auth valida credenciales
- App obtiene
UsersRecord de Firestore - App valida rol y estado
- App redirige según rol:
- Doctor → Menu Principal Clínica
- Paciente → Menu Principal Paciente
- Asistente → Menu Principal Clínica
Validación de Rol
El widget ValidacionRolWidget se ejecuta después del login para:
- Verificar que existe
UsersRecord - Validar rol del usuario
- Verificar estado de suscripción (si aplica)
- Redirigir a la vista apropiada
Reautenticación
Para operaciones sensibles (eliminar cuenta, cambiar contraseña):
class="highlight">1
await FirebaseAuth.instance.reauthenticateWithCredential(credential);
Sistema de Invitaciones
Flujo de Invitación
- Doctor Admin genera código de invitación
- Código se almacena en Firestore
- Usuario ingresa código en app
- App valida código y clínica
- Usuario se asocia a la clínica
- Se asignan permisos según rol
Validación de Invitación
class="highlight">1
2
3
4
5
6
Future<bool> validarInvitacionClinica(String codigo) async {
// Buscar código en Firestore
// Validar que existe y no está usado
// Validar que la clínica existe
// Retornar resultado
}
Auditoría de Acceso
Todas las operaciones importantes se registran en audit_logs:
class="highlight">1
2
3
4
5
6
await AuditLogger.log(
action: 'CREATE',
resourceType: 'Consulta',
resourceId: consultaId,
changes: {...},
);
Próximos Pasos
- Integraciones - Servicios externos
- Despliegue - Build y despliegue
Anterior: Backend Firebase ← Siguiente: Integraciones →