Overslaan naar hoofdinhoud

SpEL Expressions

Openen in ChatGPT

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

Alleen Spring Security

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

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

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

Als de expressie evalueert naar true, wordt de toegang verleend. Bij false wordt de gebruiker doorgestuurd naar de pagina voor toegang geweigerd.

Ingebouwde beveiligingsfuncties​

Spring Security biedt de volgende autorisatiefuncties via SecurityExpressionRoot:

FunctieParametersOmschrijvingVoorbeeld
hasRoleString rolControleert of de gebruiker de opgegeven rol heeft (voegt automatisch ROLE_ voorop)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')
isAuthenticatedGeenGeeft true terug 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> { }

Voorwaarden combineren​

Gebruik boolean-operatoren (and, or, !) om complexe autorisatieregels te maken:

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

// Een van de voorwaarden verleent toegang
@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 multi-regel expressie
@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 de rol USER EN de autoriteit TEAM:ADMIN hebben
}

Evaluatievolgorde:

  1. @RolesAllowed evaluatoren (prioriteit 5) controleren de rol USER
  2. Als deze slaagt, evalueert @RouteAccess evaluatoren (prioriteit 6) de SpEL-expressie
  3. Als deze slaagt, worden de aangepaste evaluatoren uitgevoerd (prioriteit 10+)

Aangepaste foutcodes​

Geef betekenisvolle 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 de weigering wanneer de expressie evalueert naar false.

Beschikbare variabelen​

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

VariabeleTypeOmschrijving
authenticationAuthenticationSpring Security authenticatieobject
principalObjectDe geauthenticeerde principal (meestal UserDetails)
routeClassClass<? extends Component>De routecomponentklasse die wordt geopend
contextNavigationContextwebforJ navigatiecontext
securityContextRouteSecurityContextwebforJ routebeveiligingscontext

Voorbeeld met 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 puur gebaseerd is op rollen of autoriteiten
  • Gecombineerd met ingebouwde beveiligingsfuncties en boolean-logica
  • Routespecifieke regels die geen hergebruik vereisen

Gebruik aangepaste evaluatoren wanneer:

  • Autorisatie afhankelijk is van routeparameters (eigendomcontroles)
  • Complexe bedrijfslogica die integratie met Spring-services 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.