Saltar al contenido principal

Security Annotations

Abrir en ChatGPT

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.

Nota de implementación

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.

LoginView.java
@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 @AnonymousAccess está presente, los usuarios no autenticados pueden acceder a esta página sin ser redirigidos.
Casos de uso comunes

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.

InboxView.java
@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.
Modo seguro por defecto

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

TrashView.java
@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 ADMIN pueden acceder a la vista de la papelera.
  • Los usuarios sin el rol ADMIN son redirigidos a la página de acceso denegado.

Requisitos de múltiples roles

SettingsView.java
@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 ADMIN o MANAGER pueden acceder a la configuración.
  • El usuario solo necesita uno de los roles listados, no todos.
Convenciones de nomenclatura de roles

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.

MaintenanceView.java
@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.
Uso temporal

@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:

  1. Usuarios no autenticados: Redirigidos a la página de inicio de sesión configurada en tu configuración de seguridad.
  2. Usuarios autenticados sin roles requeridos: Redirigidos a la página de acceso denegado.
  3. 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.

Agrega esto a tu application.properties:

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 @AnonymousAccess son 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)

application.properties
webforj.security.secure-by-default=false

Con seguro por defecto deshabilitado:

  • Las rutas sin anotaciones son accesibles públicamente.
  • Debes agregar explícitamente @PermitAll o @RolesAllowed para 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> { }
Mejor práctica

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.