Security Annotations
Las anotaciones de seguridad proporcionan una forma declarativa de controlar el acceso a las rutas en tu aplicación webforJ. Al agregar anotaciones a tus componentes de ruta, defines quién puede acceder a cada vista sin necesidad de escribir comprobaciones de permisos manuales. El sistema de seguridad hace cumplir automáticamente estas reglas antes de que se renderice cualquier componente.
Esta guía funciona con cualquier implementación de seguridad. Los ejemplos mostrados funcionan tanto con Spring Security como con implementaciones personalizadas. Si no estás usando Spring Boot, consulta la guía de Arquitectura de Seguridad para entender la base y implementar seguridad personalizada.
@AnonymousAccess - rutas públicas
La anotación @AnonymousAccess marca una ruta como accesible públicamente. Los usuarios no necesitan estar autenticados para acceder a estas rutas. Esta anotación se usa típicamente para páginas de inicio de sesión, páginas de aterrizaje públicas u otro contenido que deba estar disponible para todos.
@Route("/login")
@AnonymousAccess
public class LoginView extends Composite<Login> {
public LoginView() {
// vista de inicio de sesión
}
}
En este ejemplo:
- Cualquier usuario, autenticado o no, puede acceder a la ruta
/login. - Cuando
@AnonymousAccessestá presente, los usuarios no autenticados pueden acceder a esta página sin ser redirigidos.
Usa @AnonymousAccess para páginas de inicio de sesión, páginas de registro, páginas de inicio públicas, términos de servicio, políticas de privacidad y cualquier otro contenido que deba ser accesible sin autenticación.
@PermitAll - rutas autenticadas
La anotación @PermitAll requiere que los usuarios estén autenticados pero no impone requisitos específicos de rol. Cualquier usuario que haya iniciado sesión puede acceder a estas rutas, independientemente de sus roles o permisos.
@Route(value = "/", outlet = MainLayout.class)
@PermitAll
public class InboxView extends Composite<FlexLayout> {
private final FlexLayout self = getBoundComponent();
public InboxView() {
self.setHeight("100%");
self.add(new Explore("Bandeja de entrada"));
}
}
En este ejemplo:
- Los usuarios deben estar autenticados para acceder a la bandeja de entrada.
- Cualquier usuario autenticado puede ver esta página, sin importar su rol.
- Los usuarios no autenticados son redirigidos a la página de inicio de sesión.
Cuando el modo seguro por defecto está habilitado, las rutas sin ninguna anotación de seguridad se comportan igual que @PermitAll: requieren autenticación. Consulta la sección de seguro por defecto para más detalles.
@RolesAllowed - rutas basadas en roles
La anotación @RolesAllowed restringe el acceso a usuarios con roles específicos. Puedes especificar uno o más roles, y los usuarios deben tener al menos uno de los roles listados para acceder a la ruta.
Requisito de rol único
@Route(value = "/trash", outlet = MainLayout.class)
@RolesAllowed("ADMIN")
public class TrashView extends Composite<FlexLayout> {
private final FlexLayout self = getBoundComponent();
public TrashView() {
self.setHeight("100%");
self.add(new Explore("Papelera"));
}
}
En este ejemplo:
- Solo los usuarios con el rol
ADMINpueden acceder a la vista de la papelera. - Los usuarios sin el rol
ADMINson redirigidos a la página de acceso denegado.
Requisitos de múltiples roles
@Route(value = "/settings", outlet = MainLayout.class)
@RolesAllowed({"ADMIN", "MANAGER"})
public class SettingsView extends Composite<FlexLayout> {
private final FlexLayout self = getBoundComponent();
public SettingsView() {
self.add(new Explore("Configuraciones"));
}
}
En este ejemplo:
- Los usuarios con el rol
ADMINoMANAGERpueden acceder a la configuración. - El usuario solo necesita uno de los roles listados, no todos.
Utiliza nombres de roles en mayúsculas (como ADMIN, USER, MANAGER) para mantener la consistencia. Esto coincide con las convenciones comunes de los marcos de seguridad y hace que tu código sea más legible.
@DenyAll - rutas bloqueadas
La anotación @DenyAll bloquea el acceso a una ruta para todos los usuarios, independientemente del estado de autenticación o roles. Esto es útil para deshabilitar temporalmente rutas durante el mantenimiento o para rutas que están en desarrollo.
@Route(value = "/maintenance", outlet = MainLayout.class)
@DenyAll
public class MaintenanceView extends Composite<FlexLayout> {
private final FlexLayout self = getBoundComponent();
public MaintenanceView() {
self.add(new Paragraph("Esta página está en mantenimiento."));
}
}
En este ejemplo:
- Ningún usuario puede acceder a esta ruta, ni siquiera los administradores.
- Todos los intentos de acceso resultan en una redirección a la página de acceso denegado.
@DenyAll se usa generalmente de forma temporal durante el desarrollo o mantenimiento. Para aplicaciones en producción, considera eliminar la ruta por completo o usar restricciones de rol adecuadas en su lugar.
Qué sucede cuando se deniega el acceso
Cuando un usuario intenta acceder a una ruta a la que no está autorizado, el sistema de seguridad maneja la denegación automáticamente:
- Usuarios no autenticados: Redirigidos a la página de inicio de sesión configurada en tu configuración de seguridad.
- Usuarios autenticados sin roles requeridos: Redirigidos a la página de acceso denegado.
- Todos los usuarios en rutas
@DenyAll: Redirigidos a la página de acceso denegado.
Puedes personalizar estas ubicaciones de redirección para que coincidan con la estructura de navegación de tu aplicación, de modo que las denegaciones de acceso y las solicitudes de autenticación conduzcan a las páginas deseadas. Consulta Configurar Spring Security para detalles de configuración.
Seguro por defecto
Seguro por defecto es una opción de configuración que determina cómo se tratan las rutas sin ninguna anotación de seguridad. Cuando está habilitado, todas las rutas requieren autenticación por defecto a menos que se marquen explícitamente con @AnonymousAccess.
Habilitado (recomendado para producción)
Agrega esto a tu application.properties:
webforj.security.secure-by-default=true
Con seguro por defecto habilitado:
- Las rutas sin anotaciones requieren autenticación (igual que
@PermitAll). - Solo las rutas
@AnonymousAccessson accesibles públicamente. - Debes marcar explícitamente las rutas públicas, reduciendo el riesgo de exponer accidentalmente contenido protegido.
// Requiere autenticación (sin anotación)
@Route("/dashboard")
public class DashboardView extends Composite<Div> { }
// Acceso público (marcado explícitamente)
@Route("/about")
@AnonymousAccess
public class AboutView extends Composite<Div> { }
Deshabilitado (permitir por defecto)
webforj.security.secure-by-default=false
Con seguro por defecto deshabilitado:
- Las rutas sin anotaciones son accesibles públicamente.
- Debes agregar explícitamente
@PermitAllo@RolesAllowedpara proteger rutas. - Más fácil para el desarrollo, pero más arriesgado para producción.
// Acceso público (sin anotación)
@Route("/about")
public class AboutView extends Composite<Div> { }
// Requiere autenticación (marcado explícitamente)
@Route("/dashboard")
@PermitAll
public class DashboardView extends Composite<Div> { }
Habilita secure-by-default para aplicaciones en producción. Con esta configuración, las rutas protegidas no se exponen a menos que se marquen explícitamente como públicas, reduciendo el riesgo de exposición accidental debido a anotaciones faltantes. Solo desactívala durante el desarrollo inicial si encuentras las anotaciones adicionales engorrosas.