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