Spring security – Authentification Custom (partie 1)

springsecurity

Dans cet article nous allons voir comment utiliser l'authentification spring security avec plus de paramètres que le login et le mot de passe.

Ce projet est réalisé avec spring-mvc, spring-data-jpa et spring-security en JSP.

Maven

Pour utiliser ces librairies, il faut les rajouter dans le pom du projet :

<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-core</artifactId>
 <version>3.1.4.RELEASE</version>
 </dependency>
<dependency>
 <groupId>org.springframework.security</groupId>
 <artifactId>spring-security-core</artifactId>
 <version>3.1.4.RELEASE</version>
 </dependency>
<dependency>
 <groupId>org.springframework.security</groupId>
 <artifactId>spring-security-config</artifactId>
 <version>3.1.4.RELEASE</version>
 </dependency>
<dependency>
 <groupId>org.springframework.security</groupId>
 <artifactId>spring-security-web</artifactId>
 <version>3.1.4.RELEASE</version>
 </dependency>
<dependency>
 <groupId>org.springframework.security</groupId>
 <artifactId>spring-security-taglibs</artifactId>
 <version>3.1.4.RELEASE</version>
 </dependency>

 

web.xml :

Il faut rajouter les lignes suivantes qui permettent d'utiliser spring security et surtout d'utiliser des paramètres supplémentaires :

<listener>
 <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
 </listener>
<filter>
 <filter-name>requestContextFilter</filter-name>
 <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
 </filter>
<filter-mapping>
 <filter-name>requestContextFilter</filter-name>
 <url-pattern>/*</url-pattern>
 </filter-mapping>
<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>

Et la dernière ligne qui va permettre de configurer la durée de la session :

<session-config>
 <session-timeout>15</session-timeout>
 </session-config>

Configuration de spring security :

<security:http auto-config="true" use-expressions="true"
 authentication-manager-ref="authenticationManager">
 <security:intercept-url pattern="/login"
 access="permitAll" />
 <security:intercept-url pattern="/j_spring_security_check"
 access="permitAll" />
 <security:intercept-url pattern="/**"
 access="isFullyAuthenticated()" />
 <security:form-login login-page="/login"
 login-processing-url="/j_spring_security_check"
 authentication-failure-url="/login" />
 <security:logout logout-success-url="/login"
 invalidate-session="true" logout-url="/logout"
 delete-cookies="JSESSIONID,SPRING_SECURITY_REMEMBER_ME_COOKIE" />
 <security:custom-filter ref="requestContextFilter"
 before="FORM_LOGIN_FILTER" />
 <security:remember-me key="netapsys"
 token-validity-seconds="864000" user-service-ref="securityService" />
 </security:http>
<bean id="requestContextFilter" class="org.springframework.web.filter.RequestContextFilter" />
<security:authentication-manager id="authenticationManager">
 <security:authentication-provider
 ref="customAuthenticationProvider" />

 </security:authentication-manager>

On autorise d'abord toutes les pages qui ne requièrent pas d'authentification, ensuite on déclare le manager qui va réalisé l'authentification.

Dans l'exemple que je vais donner, nous avons rajouté sur la page de login un radio button qui permet de définir le rôle de l'utilisateur.

Nous allons maintenant voir la classe qui va gérer l'authentification.

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
/**
 * {@inheritDoc}
 */
 @Override
public Authentication authenticate(final Authentication authentication) throws AuthenticationException {
final ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();

// On récupère j_username et j_password
final String name = authentication.getName();
final String password = authentication.getCredentials().toString();

// On récupère le paramètre supplémentaire dans notre cas un radio button
final Integer role = Integer.parseInt(attr.getRequest().getParameter("role"));

//On effectue ici les étapes d'authentification

// Pour finir on retourne un objet de type Authentication
return new UsernamePasswordAuthenticationToken( name, password, authorities);
// authorities représente une liste de SimpleGrantedAuthority

}

Ce mécanisme permet d'utiliser Spring security en ayant des paramètres supplémentaires qui dans le cas de ce projet changeaient la base de données utilisée.

3 commentaires

  1. Salut rémy,

    j’ai envie d’avoir des url de login form avec un path variable du genre

    /cards/platformID/login comment faire ça va spring security sachant que le platformID est un paramétre supplémentaire à l’authentication

  2. Bonjour,

    Si vous utilisez spring mvc, vous pouvez diriger l’utilisateur sur une page de login et mettre « plateformID » dans un input que vous pourrez ensuite récupérer en utilisant la méthode de l’article.

  3. Bonjour. Je suis en train de developper une application web ou il y’a des etudiants et un administrateur qui doivent se connecter et se deconnecter. Mon probleme est : comment je dois mettre en place Spring Security afin de limiter l’acces a certaines partie de l’application aux etudiant et egalement recuperer l’identifiant de celui-ci afin de pouvoir le mettre dans les annonces qu’il publie sur le site. mercii et c’est urgent !

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.