Zum Hauptinhalt springen

SpEL Expressions

In ChatGPT öffnen

Spring Expression Language (SpEL) bietet eine deklarative Möglichkeit, Autorisierungsregeln direkt in Annotationen zu definieren. Die Annotation @RouteAccess evaluiert SpEL-Ausdrücke unter Verwendung der integrierten Autorisierungsfunktionen von Spring Security.

Nur Spring Security

SpEL-Ausdrücke sind nur verfügbar, wenn die Spring-Integration verwendet wird.

Grundlegende Verwendung

Die Annotation @RouteAccess akzeptiert einen SpEL-Ausdruck, der zu einem boolean führt:

@Route("/admin/dashboard")
@RouteAccess("hasRole('ADMIN')")
public class AdminDashboardView extends Composite<Div> {
// Nur Benutzer mit der Rolle ROLE_ADMIN können zugreifen
}

Wenn der Ausdruck true ergibt, wird der Zugriff gewährt. Wenn false, wird der Benutzer zur Seite für den Zugriffsverweigerung umgeleitet.

Eingebaute Sicherheitsfunktionen

Spring Security bietet die folgenden Autorisierungsfunktionen über SecurityExpressionRoot:

FunktionParameterBeschreibungBeispiel
hasRoleString roleÜberprüft, ob der Benutzer die angegebene Rolle hat (automatisch mit ROLE_ vorangestellt)hasRole('ADMIN') entspricht ROLE_ADMIN
hasAnyRoleString... rolesÜberprüft, ob der Benutzer eine der angegebenen Rollen hathasAnyRole('ADMIN', 'MANAGER')
hasAuthorityString authorityÜberprüft, ob der Benutzer den genauen Autorisierungsstring hathasAuthority('REPORTS:READ')
hasAnyAuthorityString... authoritiesÜberprüft, ob der Benutzer eine der angegebenen Autorisierungen hathasAnyAuthority('REPORTS:READ', 'REPORTS:WRITE')
isAuthenticatedKeineGibt true zurück, wenn der Benutzer authentifiziert istisAuthenticated()

Beispiele

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

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

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

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

Bedingungen kombinieren

Verwenden Sie boolesche Operatoren (and, or, !), um komplexe Autorisierungsregeln zu erstellen:

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

// Jede Bedingung gewährt Zugang
@Route("/support")
@RouteAccess("hasRole('ADMIN') or hasRole('SUPPORT')")
public class SupportView extends Composite<Div> { }

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

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

Kombination mit anderen Annotationen

@RouteAccess funktioniert zusammen mit standardmäßigen Sicherheitsannotationen. Die Auswerter werden in der Prioritätsreihenfolge ausgeführt:

@Route("/team/admin")
@RolesAllowed("USER")
@RouteAccess("hasAuthority('TEAM:ADMIN')")
public class TeamAdminView extends Composite<Div> {
// Muss die Rolle USER UND die Autorisierung TEAM:ADMIN haben
}

Evaluierungsreihenfolge:

  1. Der Evaluator von @RolesAllowed (Priorität 5) überprüft die Rolle USER
  2. Wenn bestanden, wird der Evaluator von @RouteAccess (Priorität 6) den SpEL-Ausdruck auswerten
  3. Wenn bestanden, werden benutzerdefinierte Evaluatoren (Priorität 10+) ausgeführt

Benutzerdefinierte Fehlercodes

Liefern Sie aussagekräftige Fehlercodes für Zugriffsverweigerungen:

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

Der Parameter code identifiziert den Grund für die Verweigerung, wenn der Ausdruck false ergibt.

Verfügbare Variablen

SpEL-Ausdrücke haben Zugriff auf diese Variablen im Auswertungskontext:

VariableTypBeschreibung
authenticationAuthenticationSpring Security Authentifizierungsobjekt
principalObjectDer authentifizierte Principal (normalerweise UserDetails)
routeClassClass<? extends Component>Die Route-Komponentenklasse, die zugegriffen wird
contextNavigationContextwebforJ Navigationskontext
securityContextRouteSecurityContextwebforJ Routen-Sicherheitskontext

Beispiel für die Verwendung von Variablen:

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

Wann SpEL VS benutzerdefinierte Evaluatoren verwenden

Verwenden Sie @RouteAccess SpEL, wenn:

  • Die Autorisierung rein auf Rollen oder Berechtigungen basiert
  • Eingebaute Sicherheitsfunktionen mit boolescher Logik kombiniert werden
  • Routenspezifische Regeln benötigt werden, die keine Wiederverwendung erfordern

Verwenden Sie benutzerdefinierte Evaluatoren, wenn:

  • Die Autorisierung von Routenparametern abhängt (Besitzüberprüfungen)
  • Komplexe Geschäftslogik erforderlich ist, die eine Integration mit Spring-Diensten benötigt
  • Wiederverwendbare Autorisierungsmuster über mehrere Routen hinweg erforderlich sind
  • Benutzerdefinierte Annotationen, die die Autorisierungsabsicht dokumentieren

Siehe den Leitfaden für benutzerdefinierte Evaluatoren zur Implementierung fortgeschrittener Autorisierungsszenarien.