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 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.

Uso básico

La anotación @RouteAccess acepta una expresión SpEL que evalúa a 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 evalúa a 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 (automáticamente lo precede con 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 son requeridas
@Route("/moderator/reports")
@RouteAccess("hasRole('MODERATOR') and hasAuthority('REPORTS:VIEW')")
public class ModeratorReportsView extends Composite<Div> { }

// Cualquiera de las condiciones concede 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 con 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 autoridad TEAM:ADMIN
}

Orden de evaluación:

  1. El 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 las denegaciones 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 denegación cuando la expresión evalúa a 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 de webforJ
securityContextRouteSecurityContextcontexto de seguridad de ruta de webforJ

Ejemplo usando 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 empresarial compleja que requiere la 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.