Seguridad 25.10
Esta función está en vista pública y lista para su uso en producción. Durante el período de vista previa, las API pueden ser refinadas en función de las opiniones de la comunidad de desarrolladores. Cualquier cambio se anunciará con anticipación a través de notas de versión y se proporcionarán guías de migración cuando sea necesario.
En las aplicaciones web modernas, la seguridad se refiere a controlar el acceso a diferentes partes de tu aplicación en función de la identidad y permisos del usuario. En webforJ, la seguridad proporciona un marco para el control de acceso a nivel de rutas, donde puedes proteger vistas, requerir autenticación y hacer cumplir permisos basados en roles.
Routing Tradicional VS Seguro
En el enrutamiento tradicional no seguro, todas las rutas en tu aplicación son accesibles para cualquiera que conozca la URL. Esto significa que los usuarios pueden navegar a páginas sensibles como paneles de administración o dashboards de usuarios sin ninguna verificación de autenticación o autorización. La carga recae en los desarrolladores para verificar manualmente los permisos en cada componente, lo que lleva a una aplicación inconsistente de la seguridad y potenciales vulnerabilidades.
Este enfoque introduce varios problemas:
- Verificaciones manuales: Los desarrolladores deben recordar agregar lógica de seguridad en cada vista o diseño protegido.
- Aplicación inconsistente: Las verificaciones de seguridad dispersas en el código conducen a brechas y errores.
- Sobrecarga de mantenimiento: Cambiar las reglas de acceso requiere actualizar múltiples archivos.
- Sin control centralizado: No hay un lugar único para entender o gestionar la seguridad de la aplicación.
El enrutamiento seguro en webforJ resuelve esto al habilitar el control de acceso directamente a nivel de ruta. El sistema de seguridad aplica automáticamente las reglas antes de que cualquier componente sea renderizado, proporcionando un enfoque centralizado y declarativo para la seguridad de la aplicación. Así es como funciona:
- Anotaciones declarativas: Marca rutas con anotaciones de seguridad para definir requisitos de acceso.
- Aplicación automática: El sistema de seguridad verifica permisos antes de renderizar cualquier vista.
- Configuración centralizada: Define el comportamiento de seguridad en un solo lugar y aplícalo de manera consistente.
- Implementaciones flexibles: Elige entre la integración con Spring Security o una implementación personalizada en Java puro.
Este diseño permite autenticación (verificar la identidad del usuario) y autorización (verificar a qué puede acceder el usuario), de modo que solo a los usuarios autorizados se les otorga acceso a las rutas protegidas. Los usuarios no autorizados son redirigidos automáticamente o se les niega el acceso en función de las reglas de seguridad configuradas.
Ejemplo de enrutamiento seguro en webforJ
Aquí tienes un ejemplo que muestra diferentes niveles de seguridad en una aplicación webforJ:
// Página de inicio de sesión pública - cualquiera puede acceder
@Route("/login")
@AnonymousAccess
public class LoginView extends Composite<Login> {
private final Login self = getBoundComponent();
public LoginView() {
self.onSubmit(e -> {
handleLogin(e.getUsername(), e.getPassword());
});
whenAttached().thenAccept(c -> {
self.open();
});
}
}
// Productos - requiere autenticación
@Route(value = "/", outlet = MainLayout.class)
public class ProductsView extends Composite<FlexLayout> {
public ProductsView() {
// vista de productos
}
}
// Facturas - requiere rol de CONTADOR
@Route(value = "/invoices", outlet = MainLayout.class)
@RolesAllowed("ACCOUNTANT")
public class InvoicesView extends Composite<FlexLayout> {
public InvoicesView() {
// vista de facturas
}
}
En esta configuración:
- La
LoginViewestá marcada con@AnonymousAccess, permitiendo que los usuarios no autenticados accedan a ella. - La
ProductsViewno tiene anotación de seguridad, lo que significa que requiere autenticación por defecto (cuando se habilita el modosecure-by-default). - La
InvoicesViewrequiere el rol deACCOUNTANT, por lo que solo los usuarios con permisos de contabilidad pueden acceder a las facturas.
Cómo funciona la seguridad
Cuando un usuario intenta navegar a una ruta, el sistema de seguridad sigue este flujo:
- Navegación iniciada: El usuario hace clic en un enlace o ingresa una URL.
- Verificación de seguridad: Antes de renderizar el componente, el sistema evalúa las anotaciones y reglas de seguridad.
- Decisión: Basado en el estado de autenticación y roles del usuario:
- Conceder: Permitir navegación y renderizar el componente.
- Denegar: Bloquear la navegación y redirigir a la página de inicio de sesión o página de acceso denegado.
- Renderizar o redirigir: Ya sea que se muestre el componente solicitado, o el usuario es redirigido adecuadamente.
Con la aplicación automática, las reglas de seguridad se aplican de manera consistente en toda tu aplicación, por lo que el control de acceso se maneja antes de que cualquier componente sea renderizado y los desarrolladores no necesitan agregar verificaciones manuales en cada vista.
Autenticación VS autorización
Para implementar correctamente la seguridad en tu aplicación, es importante conocer la diferencia entre estos dos conceptos:
-
Autenticación: Verificar quién es el usuario. Esto suele ocurrir durante el inicio de sesión cuando el usuario proporciona credenciales (nombre de usuario y contraseña). Una vez autenticado, la identidad del usuario se almacena en la sesión o el contexto de seguridad.
-
Autorización: Verificar a qué puede acceder el usuario autenticado. Esto implica comprobar si el usuario tiene los roles o permisos requeridos para acceder a una ruta específica. La autorización ocurre cada vez que un usuario navega a una ruta protegida.
El sistema de seguridad de webforJ maneja ambos aspectos:
- Anotaciones como
@PermitAllmanejan requisitos de autenticación. - Anotaciones como
@RolesAllowedmanejan requisitos de autorización.
Comenzando
Esta guía asume que estás usando Spring Boot con Spring Security, que es el enfoque recomendado para la mayoría de las aplicaciones webforJ. Spring Security proporciona autenticación y autorización de estándar industrial con configuración automática a través de Spring Boot.
El resto de esta documentación te guiará a través de la seguridad de tus rutas con Spring Security, desde la configuración básica hasta funciones avanzadas. Si no estás utilizando Spring Boot o necesitas una implementación de seguridad personalizada, consulta la guía de Arquitectura de Seguridad para aprender cómo funciona el sistema y cómo implementar seguridad personalizada.
Temas
📄️ Getting Started
Spring Security proporciona autenticación y autorización para aplicaciones Spring Boot. Cuando se integra con webforJ, protege las rutas utilizando anotaciones mientras Spring maneja la gestión de usuarios y sesiones.
📄️ Security Annotations
Las anotaciones de seguridad proporcionan una forma declarativa de controlar el acceso a las rutas en tu aplicación webforJ. Al añadir anotaciones a tus componentes de ruta, defines quién puede acceder a cada vista sin necesidad de realizar comprobaciones de permisos manualmente. El sistema de seguridad aplica automáticamente estas reglas antes de que se renderice cualquier componente.
📄️ Accessing User
Spring Security almacena la información del usuario autenticado en el SecurityContextHolder, proporcionando acceso al nombre de usuario, roles y autoridades a lo largo de tu aplicación. Esta sección muestra cómo recuperar y utilizar esta información en las vistas y componentes de webforJ.
📄️ SpEL Expressions
Spring Expression Language (SpEL) proporciona una forma declarativa de definir reglas de autorización directamente en anotaciones. La anotación @RouteAccess evalúa expresiones SpEL utilizando las funciones de autorización integradas de Spring Security.
📄️ Custom Evaluators
Los evaluadores personalizados extienden el sistema de seguridad de webforJ con lógica de control de acceso especializada más allá de la autenticación básica y las comprobaciones de roles. Úselos cuando necesite verificar condiciones dinámicas que dependan del contexto de la solicitud, no solo de los permisos del usuario.
🗃️ Architecture
4 artículos