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.

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

Commentaires