Protected
Protected controla acceso a UI privada según el estado de autenticación.
Es un guard de cliente: decide si renderiza el contenido, muestra loading, o redirige.
Cuándo usarlo
Sección titulada «Cuándo usarlo»- Rutas privadas (
/dashboard,/settings,/billing) - Secciones internas que requieren sesión activa
- Flujos con verificación inicial de auth (
isLoading)
API (configObject)
Sección titulada «API (configObject)»| Campo | Tipo | Requerido | Qué hace |
|---|---|---|---|
states.user | TUser | null | Sí | Usuario autenticado; si es null, no hay sesión |
states.isLoading | boolean | Sí | Estado de verificación de sesión |
redirectionPath | string | Sí | Ruta interna destino cuando no hay sesión |
loadingComponent | ReactNode | No | UI personalizada mientras carga |
defaultMessage | string | No | Texto de fallback si no define loadingComponent |
type ProtectedConfig<TUser = unknown> = { states: { user: TUser | null; isLoading: boolean; }; redirectionPath: string; loadingComponent?: React.ReactNode; defaultMessage?: string;};Flujo de decisión (cómo funciona)
Sección titulada «Flujo de decisión (cómo funciona)»-
isLoading === true- Muestra
loadingComponentsi existe. - Si no, muestra
defaultMessage(si existe). - Si no hay ninguno, renderiza
null.
- Muestra
-
isLoading === falseyuser === null- Redirige a
redirectionPathconreplace: true(no agrega historial extra).
- Redirige a
-
isLoading === falsey hayuser- Renderiza
children.
- Renderiza
Ejemplo recomendado
Sección titulada «Ejemplo recomendado»import { Protected } from '@arielgonzaguer/michi-router/protected';
const protectedConfig = { states: { user, isLoading }, redirectionPath: '/login', loadingComponent: <div>Verificando autenticación...</div>, defaultMessage: 'Cargando...'};
{ path: '/dashboard', component: ( <Protected configObject={protectedConfig}> <Dashboard /> </Protected> )}Buenas prácticas
Sección titulada «Buenas prácticas»- Inicialice
isLoadingentruehasta finalizar verificación de sesión. - Mantenga
redirectionPathsimple e interna (/login,/). - Use
loadingComponentpara evitar parpadeo visual. - Mantenga el guard delgado: no haga fetches pesados dentro de
Protected. - Para control por roles, componga encima de
Protected.
Patrón por roles
Sección titulada «Patrón por roles»function AdminOnly({ children }: { children: React.ReactNode }) { const { user } = useAuthStore(); if (!user || user.role !== 'admin') return <div>Sin permisos</div>; return <>{children}</>;}
{ path: '/admin', component: ( <Protected configObject={protectedConfig}> <AdminOnly> <AdminPage /> </AdminOnly> </Protected> )}Errores comunes
Sección titulada «Errores comunes»-
isLoadinginicia enfalseantes de verificar auth.
Resultado: redirección prematura al login. -
redirectionPathexterna o insegura (https://...,javascript:...).
Resultado: se bloquea y usa/como fallback seguro. -
Usar
Protectedcomo única seguridad de datos.
Resultado: riesgo si backend no valida permisos.
Seguridad
Sección titulada «Seguridad»Protected valida redirectionPath internamente.
Si la ruta no es segura/interna, aplica fallback a /.
Protectedprotege navegación y renderizado de UI en cliente.
La autorización real debe validarse también en backend/API/Firestore rules.