Flex, BlazeDS et Spring Security : The FlexSession is invalid

Article publié par Nicolas Jozwiak le 12 mars 2009.

Catégorie(s) : RIA

 

5 commentaires »

Lors du développement d’une application, j’ai été confronté à un problème avec l’intégration de BlazeDS et de Spring Security. En effet lorsque je me connectais, je pouvais accéder à l’application. Mais lorsque je fermais, ouvrais le navigateur puis me reconnectais, une erreur apparaissait :

flex.messaging.LocalizedException: The FlexSession is invalid.
    at flex.messaging.FlexSession.checkValid(FlexSession.java:906)
    at flex.messaging.FlexSession.getUserPrincipal(FlexSession.java:225)
    at flex.messaging.HttpFlexSession.getUserPrincipal(HttpFlexSession.java:272)
    at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:327)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1097)
    at com.wavecom.ui.util.AddToMDCFilter.doFilter(AddToMDCFilter.java:68)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:378)


En se tournant vers la documentation de BlazeDS, nous voyons que celui-ci n’est pas capable d’invalider lui-même des sessions HTTP. Il est cependant possible d’utiliser un paramètre dans les propriétés des channels afin d’invalider une session:

<invalidate-session-on-disconnect>true</invalidate-session-on-disconnect>

Mais malgré cette option l’erreur restait présente… étrange.

Après quelques recherches plus poussées (merci Google), je suis tombé sur les problèmes liés aux Session Fixation et sur cet article.
En effet, en creusant un peu plus, nous voyons dans la documentation de configuration de Spring :

« Session fixation attacks are a potential risk where it is possible for a malicious attacker to create a session by accessing a site, then persuade another user to log in with the same session (by sending them a link containing the session identifier as a parameter, for example). »

Afin de contrer cela, Spring a pris le parti de créer une nouvelle session à chaque authentification d’un utilisateur.
Nous pouvons ainsi comprendre le problème. En effet, nous utilisons un channel HTTP et une instance de la classe HttpFlexSession (flex.messaging.HttpFlexSession) contenant des attributs dont une Map de flexSession. Cette Map contient les id de session des utilisateurs. A la première connexion, cette instance récupère une requête avec un id session qui sera placé dans cette Map. Et lors de la deuxième connexion, la requête contiendra un autre id session. Le problème est que l'instance de HttpFlexSession va rechercher l'id session de la deuxième connexion dans la Map mais ne la trouvera pas, d'où l'exception citée ci-dessus.

Néanmoins, il existe une solution : mettre le paramètre session-fixation-protection à none dans votre fichier de configuration Spring

<security:http auto-config="true" access-denied-page="/" session-fixation-protection="none">

Avec cette solution, la session ne sera pas systématiquement recréée et l'exception ne sera plus présente ! En espérant que cette solution puisse aider d'autres personnes !

5 réponses à “Flex, BlazeDS et Spring Security : The FlexSession is invalid”

  1. yakafokon dit :

    Cool, merci pour l’info, je vais justement intégrer Spring Security avec Blazeds.

  2. Amorachavrou dit :

    Merci pour ces précisions qui m’ont permis de solutionner ce problème.

  3. remi dit :

    Merci pour ce merveilleux post très bien écrit qui vient de me sauver

  4. naw dit :

    Merciii énormément. Mon problème est résolu

  5. Flexina dit :

    Merci pour cette solution très utile !

Laisser un commentaire

 

Page optimized by WP Minify WordPress Plugin