SpEL Expressions
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.
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:
| Functie | Parameters | Beschrijving | Voorbeeld |
|---|---|---|---|
hasRole | String rol | Controleert of de gebruiker de opgegeven rol heeft (voegt automatisch ROLE_ vooraan toe) | hasRole('ADMIN') komt overeen met ROLE_ADMIN |
hasAnyRole | String... rollen | Controleert of de gebruiker een van de opgegeven rollen heeft | hasAnyRole('ADMIN', 'MANAGER') |
hasAuthority | String autoriteit | Controleert of de gebruiker de exacte autoriteitstring heeft | hasAuthority('REPORTS:READ') |
hasAnyAuthority | String... autoriteiten | Controleert of de gebruiker een van de opgegeven autoriteiten heeft | hasAnyAuthority('REPORTS:READ', 'REPORTS:WRITE') |
isAuthenticated | Geen | Retourneert true als de gebruiker geauthenticeerd is | isAuthenticated() |
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:
@RolesAllowedevaluator (prioriteit 5) verifieert rolUSER- Als dit is geslaagd, evalueert
@RouteAccessevaluator (prioriteit 6) deSpEL-uitdrukking - 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:
| Variabele | Type | Beschrijving |
|---|---|---|
authentication | Authentication | Spring Security authenticatieobject |
principal | Object | De geauthenticeerde principal (gewoonlijk UserDetails) |
routeClass | Class<? extends Component> | De routecomponentklasse die wordt benaderd |
context | NavigationContext | webforJ navigatiecontext |
securityContext | RouteSecurityContext | webforJ 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.