Spring Security Expressions - Exemple avec hasRole

Spring Security Expressions - Exemple de rôle

1. Vue d'ensemble

Spring Security fournit une grande variété d'expressions, en utilisant le puissant langage d'expression Spring (SpEL). La plupart de ces expressions de sécurité sont évaluées par rapport à un objet contextuel -the currently authenticated principal.

L'évaluation de ces expressions est effectuée par leSecurityExpressionRoot - qui fournit la base à la fois de la sécurité Web et de la sécurité au niveau de la méthode.

La possibilité d'utiliser les expressionsSpEL comme mécanisme d'autorisation a été introduite dans Spring Security 3.0 et se poursuit dans Spring Security 4.x. Pour obtenir la liste complète des expressions dans Spring Security, jetez un œil àthis guide.

Lectures complémentaires:

Sécurité de printemps avec thymeleaf

Guide rapide d'intégration de Spring Security et de Thymeleaf

Read more

Introduction à la sécurité de la méthode Spring

Guide sur la sécurité au niveau des méthodes à l'aide de la structure Spring Security.

Read more

Autorisation à deux facteurs avec sécurité de printemps

Une implémentation pratique de l'authentification à deux facteurs avec Spring Security 4 et l'application mobile Google Authenticator.

Read more

2. Autorisation Web

Spring Security fournit deux types d'autorisation Web: la sécurisation d'unfull page based on the URL et l'affichage conditionnel departs of a JSP page en fonction des règles de sécurité.

2.1. Exemple d'autorisation de page complète

Avec les expressions activées pour l'élémenthttp, un modèle d'URL peut être sécurisé comme suit:


    
    ...

Utilisation de la configuration Java:

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .authorizeRequests()
          .antMatchers("/admin/**").hasRole("ADMIN");
    }
    ...
}

Spring Security préfixe automatiquement tout rôle avecROLE_.

L'expressionhasRole est utilisée ici pour vérifier si le principal actuellement authentifié a l'autorité spécifiée.

2.2. Exemple d'autorisation dans la page

Le second type d'autorisation Web montre sous certaines conditions une partie d'une page JSP basée sur l'évaluation d'une expression de sécurité.

Ajoutons lesdependency requis pour lesSpring Security JSP taglib support danspom.xml:


    org.springframework.security
    spring-security-taglibs
    5.0.5.RELEASE

Le support detaglib doit être activé sur la page afin d'utiliser l'espace de nomssecurity:

<%@ taglib prefix="security"
  uri="http://www.springframework.org/security/tags" %>

L'expressionhasRole peut maintenant être utilisée sur la page, pour afficher / masquer les éléments HTML en fonction de qui est actuellement authentifié lorsque la page est rendue:


    This text is only visible to a user
    
This text is only visible to an admin

3. Exemple d'autorisation au niveau de la méthode -@PreAuthorize

Les expressions de sécurité peuvent également être utilisées pour sécuriser les fonctionnalités métier au niveau de la méthode, en utilisant des annotations.

Les annotations@PreAuthorize et@PostAuthorize (ainsi que@PreFilter et@PostFilter) prennent en charge Spring Expression Language (SpEL) et fournissent un contrôle d'accès basé sur les expressions.

Tout d'abord, pour utiliser la sécurité au niveau de la méthode, nous devons l'activer dans la configuration de la sécurité à l'aide de@EnableGlobalMethodSecurity:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    ...
}

La configuration XML équivalente:

Ensuite, nous pouvons sécuriser les méthodes en utilisant l'annotation Spring@PreAuthorize:

@Service
public class FooService {
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public List findAll() { ... }
    ...
}

Désormais, seuls les principaux avec le rôle ADMIN pourront appeler la méthodefindAll avec succès.

Notez quethe Pre and Post annotations are evaluated and enforced via proxies - dans le cas où des proxys CGLIB sont utilisés, la classe et les méthodes publiques ne doivent pas être déclarées commefinal.

4. Vérification programmatique du rôle

Une autorité utilisateur peut également être vérifiée par programme, en code Java brut, si l'objetrequest est disponible:

@RequestMapping
public void someControllerMethod(HttpServletRequest request) {
    request.isUserInRole("someAuthority");
}

Et bien sûr, sans accès aurequest, la vérification peut également être effectuée manuellement en vérifiant simplement si l'utilisateur actuellement authentifié a cette autorité particulière. The user can be obtained du contexte Spring Security de différentes manières.

5. Conclusion

Ce didacticiel est une introduction rapide à l'utilisation des expressions de sécurité Spring en général, et de l'expressionhasRole en particulier, en tant qu'introduction rapide de la manière dont différentes parties de l'application peuvent être sécurisées.

Pour l'exemple d'autorisation Web, consultezthis Github simple tutorial. L'exemple de sécurité au niveau de la méthode est égalementon GitHub.