Saltar al contenido principal

SpEL Expressions

Abrir en ChatGPT

Spring Expression Language (SpEL) proporciona una forma declarativa de definir reglas de autorización directamente en las anotaciones. La anotación @RouteAccess evalúa expresiones SpEL utilizando las funciones de autorización integradas de Spring Security.

Solo Spring Security

Las expresiones SpEL están disponibles solo cuando se utiliza la integración de Spring.

La anotación @RouteAccess acepta una expresión SpEL que se evalúa como un booleano:

@Route("/admin/dashboard")
@RouteAccess("hasRole('ADMIN')")
public class AdminDashboardView extends Composite<Div> {
// Solo los usuarios con autoridad ROLE_ADMIN pueden acceder
}

Si la expresión se evalúa como true, se concede el acceso. Si es false, el usuario es redirigido a la página de acceso denegado.

Funciones de seguridad integradas​

Spring Security proporciona las siguientes funciones de autorización a través de SecurityExpressionRoot:

FunciónParámetrosDescripciónEjemplo
hasRoleString roleVerifica si el usuario tiene el rol especificado (prefijo automático ROLE_)hasRole('ADMIN') coincide con ROLE_ADMIN
hasAnyRoleString... rolesVerifica si el usuario tiene alguno de los roles especificadoshasAnyRole('ADMIN', 'MANAGER')
hasAuthorityString authorityVerifica si el usuario tiene la cadena de autoridad exactahasAuthority('REPORTS:READ')
hasAnyAuthorityString... authoritiesVerifica si el usuario tiene alguna de las autoridades especificadashasAnyAuthority('REPORTS:READ', 'REPORTS:WRITE')
isAuthenticatedNingunoDevuelve true si el usuario está autenticadoisAuthenticated()

Ejemplos​

// Verificación de rol
@Route("/admin")
@RouteAccess("hasRole('ADMIN')")
public class AdminView extends Composite<Div> { }

// Múltiples roles
@Route("/staff")
@RouteAccess("hasAnyRole('ADMIN', 'MANAGER', 'SUPERVISOR')")
public class StaffView extends Composite<Div> { }

// Verificación de autoridad
@Route("/reports")
@RouteAccess("hasAuthority('REPORTS:READ')")
public class ReportsView extends Composite<Div> { }

// Requiere autenticación
@Route("/profile")
@RouteAccess("isAuthenticated()")
public class ProfileView extends Composite<Div> { }

Combinando condiciones​

Utiliza operadores booleanos (and, or, !) para crear reglas de autorización complejas:

// Ambas condiciones requeridas
@Route("/moderator/reports")
@RouteAccess("hasRole('MODERATOR') and hasAuthority('REPORTS:VIEW')")
public class ModeratorReportsView extends Composite<Div> { }

// Cualquiera de las condiciones otorga acceso
@Route("/support")
@RouteAccess("hasRole('ADMIN') or hasRole('SUPPORT')")
public class SupportView extends Composite<Div> { }

// Negación
@Route("/trial/features")
@RouteAccess("isAuthenticated() and !hasAuthority('PREMIUM')")
public class TrialFeaturesView extends Composite<Div> { }

// Expresión compleja en múltiples líneas
@Route("/reports/advanced")
@RouteAccess("""
hasRole('ADMIN') or
(hasRole('ANALYST') and hasAuthority('REPORTS:ADVANCED'))
""")
public class AdvancedReportsView extends Composite<Div> { }

Combinando con otras anotaciones​

@RouteAccess funciona junto a anotaciones de seguridad estándar. Los evaluadores se ejecutan en orden de prioridad:

@Route("/team/admin")
@RolesAllowed("USER")
@RouteAccess("hasAuthority('TEAM:ADMIN')")
public class TeamAdminView extends Composite<Div> {
// Debe tener el rol USER Y la autoridad TEAM:ADMIN
}

Orden de evaluación:

  1. Evaluador @RolesAllowed (prioridad 5) verifica el rol USER
  2. Si se aprueba, el evaluador @RouteAccess (prioridad 6) evalúa la expresión SpEL
  3. Si se aprueba, se ejecutan los evaluadores personalizados (prioridad 10+)

Códigos de error personalizados​

Proporciona códigos de error significativos para los denegados de acceso:

@Route("/premium/features")
@RouteAccess(
value = "hasAuthority('PREMIUM')",
code = "PREMIUM_SUBSCRIPTION_REQUIRED"
)
public class PremiumFeaturesView extends Composite<Div> { }

El parámetro code identifica la razón de la denegación cuando la expresión se evalúa como false.

Variables disponibles​

Las expresiones SpEL tienen acceso a estas variables en el contexto de evaluación:

VariableTipoDescripción
authenticationAuthenticationObjeto de autenticación de Spring Security
principalObjectEl principal autenticado (generalmente UserDetails)
routeClassClass<? extends Component>La clase del componente de ruta que se está accediendo
contextNavigationContextcontexto de navegación webforJ
securityContextRouteSecurityContextcontexto de seguridad de ruta webforJ

Ejemplo utilizando variables:

@Route("/admin")
@RouteAccess("authentication.name == 'superadmin'")
public class SuperAdminView extends Composite<Div> { }

Cuándo usar SpEL VS evaluadores personalizados​

Usa @RouteAccess SpEL cuando:

  • La autorización se basa puramente en roles o autoridades
  • Combinando funciones de seguridad integradas con lógica booleana
  • Reglas específicas de ruta que no requieren reutilización

Usa evaluadores personalizados cuando:

  • La autorización depende de parámetros de ruta (verificaciones de propiedad)
  • Lógica de negocio compleja que requiere integración de servicios de Spring
  • Patrones de autorización reutilizables en múltiples rutas
  • Anotaciones personalizadas que documentan la intención de autorización

Consulta la guía de Evaluadores Personalizados para implementar escenarios de autorización avanzados.