Ir al contenido

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.

  • Rutas privadas (/dashboard, /settings, /billing)
  • Secciones internas que requieren sesión activa
  • Flujos con verificación inicial de auth (isLoading)
Campo Tipo Requerido Qué hace
states.user TUser | null Usuario autenticado; si es null, no hay sesión
states.isLoading boolean Estado de verificación de sesión
redirectionPath string 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;
};
  1. isLoading === true

    • Muestra loadingComponent si existe.
    • Si no, muestra defaultMessage (si existe).
    • Si no hay ninguno, renderiza null.
  2. isLoading === false y user === null

    • Redirige a redirectionPath con replace: true (no agrega historial extra).
  3. isLoading === false y hay user

    • Renderiza children.
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>
)
}
  • Inicialice isLoading en true hasta finalizar verificación de sesión.
  • Mantenga redirectionPath simple e interna (/login, /).
  • Use loadingComponent para evitar parpadeo visual.
  • Mantenga el guard delgado: no haga fetches pesados dentro de Protected.
  • Para control por roles, componga encima de Protected.
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>
)
}
  1. isLoading inicia en false antes de verificar auth.
    Resultado: redirección prematura al login.

  2. redirectionPath externa o insegura (https://..., javascript:...).
    Resultado: se bloquea y usa / como fallback seguro.

  3. Usar Protected como única seguridad de datos.
    Resultado: riesgo si backend no valida permisos.

Protected valida redirectionPath internamente.
Si la ruta no es segura/interna, aplica fallback a /.

Protected protege navegación y renderizado de UI en cliente.
La autorización real debe validarse también en backend/API/Firestore rules.