Passer au contenu principal

SpEL Expressions

Ouvrir dans ChatGPT

Le langage d'expression Spring (SpEL) fournit un moyen déclaratif de définir des règles d'autorisation directement dans les annotations. L'annotation @RouteAccess évalue les expressions SpEL en utilisant les fonctions d'autorisation intégrées de Spring Security.

Spring Security uniquement

Les expressions SpEL ne sont disponibles que lors de l'utilisation de l'intégration Spring.

L'annotation @RouteAccess accepte une expression SpEL qui évalue à un booléen :

@Route("/admin/dashboard")
@RouteAccess("hasRole('ADMIN')")
public class AdminDashboardView extends Composite<Div> {
// Seuls les utilisateurs ayant l'autorité ROLE_ADMIN peuvent accéder
}

Si l'expression évalue à true, l'accès est accordé. Si false, l'utilisateur est redirigé vers la page d'accès refusé.

Fonctions de sécurité intégrées​

Spring Security fournit les fonctions d'autorisation suivantes via SecurityExpressionRoot :

FonctionParamètresDescriptionExemple
hasRoleString roleVérifie si l'utilisateur possède le rôle spécifié (prefixe automatiquement avec ROLE_)hasRole('ADMIN') correspond à ROLE_ADMIN
hasAnyRoleString... rolesVérifie si l'utilisateur possède l'un des rôles spécifiéshasAnyRole('ADMIN', 'MANAGER')
hasAuthorityString authorityVérifie si l'utilisateur a la chaîne d'autorité exactehasAuthority('REPORTS:READ')
hasAnyAuthorityString... authoritiesVérifie si l'utilisateur a l'une des autorités spécifiéeshasAnyAuthority('REPORTS:READ', 'REPORTS:WRITE')
isAuthenticatedAucunRenvoie true si l'utilisateur est authentifiéisAuthenticated()

Exemples​

// Vérification du rôle
@Route("/admin")
@RouteAccess("hasRole('ADMIN')")
public class AdminView extends Composite<Div> { }

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

// Vérification de l'autorité
@Route("/reports")
@RouteAccess("hasAuthority('REPORTS:READ')")
public class ReportsView extends Composite<Div> { }

// Exiger une authentification
@Route("/profile")
@RouteAccess("isAuthenticated()")
public class ProfileView extends Composite<Div> { }

Combinaison de conditions​

Utilisez des opérateurs booléens (and, or, !) pour créer des règles d'autorisation complexes :

// Les deux conditions requises
@Route("/moderator/reports")
@RouteAccess("hasRole('MODERATOR') and hasAuthority('REPORTS:VIEW')")
public class ModeratorReportsView extends Composite<Div> { }

// L'une ou l'autre condition accorde l'accès
@Route("/support")
@RouteAccess("hasRole('ADMIN') or hasRole('SUPPORT')")
public class SupportView extends Composite<Div> { }

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

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

Combinaison avec d'autres annotations​

@RouteAccess fonctionne en parallèle avec les annotations de sécurité standard. Les évaluateurs s'exécutent dans l'ordre de priorité :

@Route("/team/admin")
@RolesAllowed("USER")
@RouteAccess("hasAuthority('TEAM:ADMIN')")
public class TeamAdminView extends Composite<Div> {
// Doit avoir le rôle USER ET l'autorité TEAM:ADMIN
}

Ordre d'évaluation :

  1. L'évaluateur @RolesAllowed (priorité 5) vérifie le rôle USER
  2. Si réussi, l'évaluateur @RouteAccess (priorité 6) évalue l'expression SpEL
  3. Si réussi, les évaluateurs personnalisés s'exécutent (priorité 10+)

Codes d'erreur personnalisés​

Fournissez des codes d'erreur significatifs pour les refus d'accès :

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

Le paramètre code identifie la raison du refus lorsque l'expression évalue à false.

Variables disponibles​

Les expressions SpEL ont accès à ces variables dans le contexte d'évaluation :

VariableTypeDescription
authenticationAuthenticationObjet d'authentification Spring Security
principalObjectLe principal authentifié (généralement UserDetails)
routeClassClass<? extends Component>La classe du composant de route étant accédée
contextNavigationContextContexte de navigation webforJ
securityContextRouteSecurityContextContexte de sécurité de route webforJ

Exemple utilisant des variables :

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

Quand utiliser SpEL ou des évaluateurs personnalisés​

Utilisez @RouteAccess SpEL lorsque :

  • L'autorisation est basée uniquement sur des rôles ou des autorités
  • Combinaison de fonctions de sécurité intégrées avec une logique booléenne
  • Règles spécifiques à la route qui ne nécessitent pas de réutilisation

Utilisez des évaluateurs personnalisés lorsque :

  • L'autorisation dépend des paramètres de la route (vérifications de propriété)
  • Logique métier complexe nécessitant l'intégration de services Spring
  • Modèles d'autorisation réutilisables à travers plusieurs routes
  • Annotations personnalisées qui documentent l'intention d'autorisation

Consultez le guide des évaluateurs personnalisés pour implémenter des scénarios d'autorisation avancés.