Overslaan naar hoofdinhoud

SpEL Expressions

Openen in ChatGPT

Spring Expression Language (SpEL) biedt een declaratieve manier om autorisatieregels direct in annotaties te definiëren. De @RouteAccess annotatie evalueert SpEL-uitdrukkingen met behulp van de ingebouwde autorisatiefuncties van Spring Security.

Alleen Spring Security

SpEL-uitdrukkingen zijn alleen beschikbaar bij gebruik van de Spring-integratie.

Basisgebruik

De @RouteAccess annotatie accepteert een SpEL-uitdrukking die evalueert naar een boolean:

@Route("/admin/dashboard")
@RouteAccess("hasRole('ADMIN')")
public class AdminDashboardView extends Composite<Div> {
// Alleen gebruikers met de rol ROLE_ADMIN kunnen toegang krijgen
}

Als de uitdrukking evalueert naar true, wordt toegang verleend. Als false, wordt de gebruiker doorgestuurd naar de toegang geweigerd pagina.

Ingebouwde beveiligingsfuncties

Spring Security biedt de volgende autorisatiefuncties via SecurityExpressionRoot:

FunctieParametersBeschrijvingVoorbeeld
hasRoleString rolControleert of de gebruiker de opgegeven rol heeft (voegt automatisch ROLE_ vooraan toe)hasRole('ADMIN') komt overeen met ROLE_ADMIN
hasAnyRoleString... rollenControleert of de gebruiker een van de opgegeven rollen heefthasAnyRole('ADMIN', 'MANAGER')
hasAuthorityString autoriteitControleert of de gebruiker de exacte autoriteitstring heefthasAuthority('REPORTS:READ')
hasAnyAuthorityString... autoriteitenControleert of de gebruiker een van de opgegeven autoriteiten heefthasAnyAuthority('REPORTS:READ', 'REPORTS:WRITE')
isAuthenticatedGeenRetourneert true als de gebruiker geauthenticeerd isisAuthenticated()

Voorbeelden

// Rolcontrole
@Route("/admin")
@RouteAccess("hasRole('ADMIN')")
public class AdminView extends Composite<Div> { }

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

// Autoriteitscontrole
@Route("/reports")
@RouteAccess("hasAuthority('REPORTS:READ')")
public class ReportsView extends Composite<Div> { }

// Vereist authenticatie
@Route("/profile")
@RouteAccess("isAuthenticated()")
public class ProfileView extends Composite<Div> { }

Combineren van voorwaarden

Gebruik boolean-operatoren (and, or, !) om complexe autorisatieregels te creëren:

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

// Toegang op basis van één van de voorwaarden
@Route("/support")
@RouteAccess("hasRole('ADMIN') or hasRole('SUPPORT')")
public class SupportView extends Composite<Div> { }

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

// Complexe meerlinie-uitdrukking
@Route("/reports/advanced")
@RouteAccess("""
hasRole('ADMIN') or
(hasRole('ANALYST') and hasAuthority('REPORTS:ADVANCED'))
""")
public class AdvancedReportsView extends Composite<Div> { }

Combineren met andere annotaties

@RouteAccess werkt samen met standaard beveiligingsannotaties. Evaluatoren worden in volgorde van prioriteit uitgevoerd:

@Route("/team/admin")
@RolesAllowed("USER")
@RouteAccess("hasAuthority('TEAM:ADMIN')")
public class TeamAdminView extends Composite<Div> {
// Moet zowel rol USER hebben EN autoriteit TEAM:ADMIN
}

Evaluatievolgorde:

  1. @RolesAllowed evaluator (prioriteit 5) verifieert rol USER
  2. Als dit is geslaagd, evalueert @RouteAccess evaluator (prioriteit 6) de SpEL-uitdrukking
  3. Als dit is geslaagd, worden aangepaste evaluatoren uitgevoerd (prioriteit 10+)

Aangepaste foutcodes

Bied zinvolle foutcodes voor toegang weigeringen:

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

De parameter code identificeert de reden voor weigering wanneer de uitdrukking evalueert naar false.

Beschikbare variabelen

SpEL-uitdrukkingen hebben toegang tot deze variabelen in de evaluatiecontext:

VariabeleTypeBeschrijving
authenticationAuthenticationSpring Security authenticatieobject
principalObjectDe geauthenticeerde principal (gewoonlijk UserDetails)
routeClassClass<? extends Component>De routecomponentklasse die wordt benaderd
contextNavigationContextwebforJ navigatiecontext
securityContextRouteSecurityContextwebforJ route beveiligingscontext

Voorbeeld van het gebruik van variabelen:

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

Wanneer SpEL VS aangepaste evaluatoren te gebruiken

Gebruik @RouteAccess SpEL wanneer:

  • Autorisatie uitsluitend is gebaseerd op rollen of autoriteiten
  • Combineren van ingebouwde beveiligingsfuncties met boolean logica
  • Specifieke regels voor routes die geen hergebruik vereisen

Gebruik aangepaste evaluatoren wanneer:

  • Autorisatie afhankelijk is van routeparameters (eigenaarschapscontroles)
  • Complexe zakelijke logica die integratie met de Spring-service vereist
  • Herbruikbare autorisatiepatronen over meerdere routes
  • Aangepaste annotaties die de autorisatie-intentie documenteren

Zie de Custom Evaluators gids voor het implementeren van geavanceerde autorisatiescenario's.