[Spring Security] Authentification par certificat

ssLogo

Dans le cadre du projet sur lequel je travaille en ce moment j’ai dû mettre en place le framework Spring Security. Le niveau de sécurité élevé demandé par notre client nécessitait une authentification par certificat signé en SHA-256. Je vais donc vous expliquer comment mettre en place Spring Security sur un projet maven et comment configurer une authentification par certificat.

Présentation de Spring Security

Spring Security est un framework d’authentification et de contrôle d’accès.
C’est est un sous-projet de Spring, il a été lancé en 2003 sous le nom d’Acegi Secuirty. En 2007 il sera renommé Spring Security. C’est l’un des projets les plus avancés de Spring.
Liste des projets Spring : http://www.springsource.org/projects

Deux concepts clés

L'authentification consiste à garantir que la personne connectée est bien celle qu'elle prétend être alors que les autorisations consistent à vérifier que la personne connectée a bien les permissions d'effectuer une action donnée ou d’accéder à une ressource.

Principe de fonctionnement : authentification par certificat

  • 1. Le client envoie le certificat au serveur : ce certificat a été renseigné dans le navigateur. (certificat.p12)
  • 2. Le serveur vérifie la validité du certificat. Il vérifie qu’il n’est pas expiré et qu’il est autorisé par l’autorité de certification.
  • 3. Ensuite Spring Security prend la main : vérification de l'identité de l'appelant via le CN du certificat. (mécanisme d’authentification)
  • 4. Vérification des droits d'accès à la ressource sollicitée.
  • 5. Mise à jour du contexte Spring Security.
  • 6. Redirection : Succès ou Echec.
ss1

ss2

Configuration : plan de bataille

  • 1. Ajout des dépendances dans le pom.xml :
  • 2. Ajout du filtrer Spring Security dans le fichier web.xml et de la référence vers votre fichier de contexte Spring Security. (fichier de configuration)
  • 3. Configuration spécifique pour l’authentification par certificat dans votre applicationContext-security.xml.
  • 4. Implémentation du service d’authentification UserDetailsService fourni par Spring Security.

1- Ajout des dépendances dans le pom.xml :

<dependency>

        <groupId>org.springframework.security</groupId>

        <artifactId>spring-security-core</artifactId>

        <version>3.0.X</version>

</dependency>

<dependency>

        <groupId>org.springframework.security</groupId>

        <artifactId>spring-security-config</artifactId>

        <version>3.0.X</version>

</dependency>

<dependency>

        <groupId>org.springframework.security</groupId>

        <artifactId>spring-security-web</artifactId>

         <version>3.0.X</version>

</dependency>

<dependency>

        <groupId>org.springframework.security</groupId>

        <artifactId>spring-security-taglibs</artifactId>

        <version>3.0.X</version>

</dependency>

<dependency>

        <groupId>org.aspectj</groupId>

        <artifactId>aspectjtools</artifactId>

        <version>1.6.X</version>

</dependency>


2- Ajout du filtre de servlet Spring Security dans le web.xml et ajout de la référence vers votre fichier de contexte Spring Security:


<context-param>

       <param-name>contextConfigLocation</param-name>

       <param-value>

             classpath:applicationContext-security.xml,

             classpath:...

       </param-value>       

</context-param>

<!-- Filter
SpringSecurity -->

<filter>

       <filter-name>springSecurityFilterChain</filter-name>

       <filter-class>

            org.springframework.web.filter.DelegatingFilterProxy

       </filter-class>

</filter>

<filter-mapping>

       <filter-name>springSecurityFilterChain</filter-name>

       <url-pattern>/*</url-pattern>

</filter-mapping>

<!-- Filter
SpringSecurity - fin -->


3- Configuration spécifique du fichier applicationContext-security.xml pour l’authentification par certificat :


<security:http auto-config="false" use-expressions="true">

        <security:intercept-url pattern="/**"
requires-channel="https" 

                                access="hasRole('ROLE_USER')"
/>

        <security:x509 subject-principal-regex="CN=(.*?),"
/>

</security:http>

<security:authentication-manager alias="myAuthenticationManager">

        <security:authentication-provider
user-service-ref="userDetailsService"
/>

</security:authentication-manager>

<bean id="userDetailsService"
class="com.xxx.xxx.service.security.MyUserDetailsService"

      autowire="byName">

</bean>


4- On implémente le service d’authentification (de Spring Security) UserDetailsService :

public class
MyUserDetailsService

    implements UserDetailsService

    @Override

    @Transactional(readOnly
=
false)

    public UserDetails loadUserByUsername(String
arg0) 

        throws
UsernameNotFoundException, DataAccessException {

       
UserDetails utilisateur = new UserDetails();

        utilisateur.setUsername(arg0);

       
boolean checkUsername = monServiceAuthentification.findByUsername(arg0); 

        if (checkUsername) {

           
List<GrantedAuthority> authorities =
new
ArrayList<GrantedAuthority>();

           
authorities.add(
new GrantedAuthorityImpl("ROLE_USER")); 

           
utilisateur.setAuthorities(authorities);

     

           
return utilisateur;

        }

        else {           

           
thrownew UsernameNotFoundException(detailAudit);

        }

    }

}

Contexte de sécurité

Voici comment récupérer
l’utilisateur ainsi que ses rôles depuis le security context :

UserDetails
utilisateur = (UserDetails)SecurityContextHolder
.getContext().getAuthentication().getPrincipal();


Conclusion

J’espère que cette entrée en matière sur Spring Security
vous aidera à mettre en place une authentification par certificat si un jour
vous y êtes confronté.  N’hésitez pas à
me faire des retours si vous voulez que je détaille plus certaines parties de
la publication, je l’étofferais au fur et à mesure.

Voici les liens vers la documentation officielle :

http://static.springsource.org/spring-security/site/docs/3.0.x/reference/x509.html

http://static.springsource.org/spring-security/site/docs/3.0.x/reference/springsecurity.html

3 commentaires

  1. Bonjour,

    merci pour le tuto. JE l’ai suivi, mais au final, j’ai ‘Cette page Web présente une boucle de redirection.’. faut-il configurer https avec les VirtualHost java ou avec tomcat ? J’ai comme l’impression qu’il me manque une configuration.

    Merci par avance

  2. J’ai juste une question : Est-ce que vous savez commet je peux récupérer le CN, le DN, la date d’expiration,l’AC… du certificat ?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.