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 mejorarse según los comentarios 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 al control de acceso a diferentes partes de tu aplicación en función de la identidad y los 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 paneles de usuario sin ninguna verificación de autenticación o autorización. La carga recae en los desarrolladores para que verifiquen 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 a lo largo de la base de código conducen a lagunas y errores.
- Sobrecarga de mantenimiento: Cambiar las reglas de acceso requiere actualizar múltiples archivos.
- Sin control centralizado: No hay un lugar único para comprender 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 renderizar cualquier componente, 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 los requisitos de acceso.
- Aplicación automática: El sistema de seguridad verifica los 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 la autenticación (verificación de la identidad del usuario) y la autorización (verificación de lo que el usuario puede acceder), por lo que solo se concede acceso a rutas protegidas a los usuarios autorizados. Los usuarios no autorizados son redirigidos automáticamente o se les niega el acceso según las reglas de seguridad configuradas.
Ejemplo de enrutamiento asegurado en webforJ
Aquí hay 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 a los usuarios no autenticados acceder a ella. - La
ProductsViewno tiene anotación de seguridad, lo que significa que requiere autenticación por defecto (cuando se activa el modosecure-by-default). - La
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: Según el estado de autenticación y roles del usuario:
- Conceder: Permitir la navegación y renderizar el componente.
- Denegar: Bloquear la navegación y redirigir 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 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 se renderice cualquier componente y los desarrolladores no necesitan agregar verificaciones manuales en cada vista.
Autenticación VS autorización
Para implementar la seguridad correctamente en tu aplicación, es importante conocer la diferencia entre estos dos conceptos:
-
Autenticación: Verificación de 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 en el contexto de seguridad.
-
Autorización: Verificación de a qué puede acceder el usuario autenticado. Esto implica verificar 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.
Empezando
Esta guía supone 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
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