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 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 !
Commentaire
5 réponses pour " Flex, BlazeDS et Spring Security : The FlexSession is invalid "
Published by yakafokon , Il y a 14 ans
Cool, merci pour l’info, je vais justement intégrer Spring Security avec Blazeds.
Published by Amorachavrou , Il y a 14 ans
Merci pour ces précisions qui m’ont permis de solutionner ce problème.
Published by remi , Il y a 13 ans
Merci pour ce merveilleux post très bien écrit qui vient de me sauver
Published by naw , Il y a 13 ans
Merciii énormément. Mon problème est résolu
Published by Flexina , Il y a 12 ans
Merci pour cette solution très utile !