Published by

Il y a 14 ans -

Temps de lecture 2 minutes

Flex, BlazeDS et Spring Security : The FlexSession is invalid

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 !

Published by

Publié par Nicolas Jozwiak

Nicolas est delivery manager disposant de 12 ans d’expérience en conception et développement. Son parcours chez un éditeur avant son entrée chez Xebia lui a notamment permis de développer de solides compétences dans le domaine de la qualité et de l’industrialisation (tests, intégration continue, gestion de configuration, contrôle qualité). Bénéficiant d’une expérience très solide de mise en place des méthodes agiles et d’accompagnement d’équipes sur le terrain, il s’attache à mettre à profit quotidiennement son expérience qui est reconnue pour son approche pragmatique, proactive et pédagogique.

Commentaire

5 réponses pour " Flex, BlazeDS et Spring Security : The FlexSession is invalid "

  1. Published by , Il y a 14 ans

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

  2. Published by , Il y a 14 ans

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

  3. Published by , Il y a 13 ans

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

  4. Published by , Il y a 13 ans

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

  5. Published by , Il y a 12 ans

    Merci pour cette solution très utile !

Laisser un commentaire

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

Nous recrutons

Être un Sapient, c'est faire partie d'un groupe de passionnés ; C'est l'opportunité de travailler et de partager avec des pairs parmi les plus talentueux.