Seguridad 25.10
Esta característica 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 base a los comentarios de la comunidad de desarrolladores. Cualquier cambio será anunciado con anticipación a través de las notas de la versión y se proporcionarán guías de migración cuando sea necesario.
En aplicaciones web modernas, la seguridad se refiere a controlar el acceso a diferentes partes de tu aplicación basado en la identidad y permisos del usuario. En webforJ, la seguridad proporciona un marco para el control de acceso a nivel de ruta, donde puedes proteger vistas, requerir autenticación y hacer cumplir permisos basados en roles.
The webforj-securing-apps skill can protect routes with login, role-based access, and ownership checks. After installing the webforJ AI plugin, ask your assistant:
- "Protect /admin so only users with the ADMIN role can see it."
- "Add a public landing page that anyone can visit."
- "Only let a user edit a record they own."
Routing Tradicional VS asegurado
En el enrutamiento tradicional no asegurado, 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 tableros de usuarios sin ninguna verificación de autenticación o autorización. La carga recae sobre los desarrolladores para verificar manualmente los permisos en cada componente, lo que lleva a una aplicación inconsistente de la seguridad y posibles vulnerabilidades.
Este enfoque introduce varios problemas:
- Controles manuales: Los desarrolladores deben recordar agregar lógica de seguridad en cada vista o diseño protegido.
- Aplicación inconsistente: Los controles de seguridad dispersos a lo largo del 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 solo lugar para entender o gestionar la seguridad de la aplicación.
El enrutamiento asegurado 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 se renderice cualquier componente, proporcionando un enfoque centralizado y declarativo para la seguridad de la aplicación. Así es como funciona:
- Anotaciones declarativas: Marca las rutas con anotaciones de seguridad para definir los 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 de 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 se concede acceso a rutas protegidas a usuarios autorizados. Los usuarios no autorizados son redirigidos automáticamente o se les deniega el acceso basado en las reglas de seguridad configuradas.
Ejemplo de enrutamiento asegurado 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 - cualquier persona 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:
LoginViewestá marcado con@AnonymousAccess, lo que permite a los usuarios no autenticados acceder a él.ProductsViewno tiene anotación de seguridad, lo que significa que requiere autenticación por defecto (cuando se habilita el modosecure-by-default).InvoicesViewrequiere el rol deACCOUNTANT, por lo que solo los usuarios con permisos contables 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 del usuario y los roles:
- Conceder: Permite la navegación y renderiza el componente.
- Denegar: Bloquea la navegación y redirige a la página de inicio de sesión o a la página de acceso denegado.
- Renderizar o redirigir: Se muestra el componente solicitado, o se redirige al usuario apropiadamente.
Con la aplicación automática de las reglas de seguridad, se aplican de manera consistente en toda tu aplicación, por lo que el control de acceso se gestiona antes de que se renderice cualquier componente 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 sus credenciales (nombre de usuario y contraseña). Una vez autenticado, la identidad del usuario se almacena en la sesión o en 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 gestiona ambos aspectos:
- Anotaciones como
@PermitAllmanejan los requisitos de autenticación. - Anotaciones como
@RolesAllowedmanejan los requisitos de autorización.
Empezando
Esta guía asume que estás utilizando 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 estándar de la industria 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 características 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 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 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.
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
Write custom RouteSecurityEvaluators for context-aware checks like ownership verification beyond role-based permissions.
Architecture
4 artículos
Application Security
3 artículos