2010-08-24 15 views
4

J'utilise les rôles wicket-auth, et en particulier 'AuthenticatedWebApplication' pour sécuriser les pages de mon application wicket. Je voudrais interdire aux utilisateurs de se connecter à partir de plusieurs emplacements avec le même identifiant. Actuellement, les utilisateurs semblent pouvoir se connecter au même utilisateur à partir de deux machines différentes.Apache Wicket - wicket-auth-sessions - Empêcher les connexions multiples

Je suis sûr que c'est aussi simple que d'invalider la session du premier utilisateur, mais je ne sais pas comment y parvenir à partir de mon application Web authentifiée lorsqu'un deuxième utilisateur arrive. Toute indication appréciée.

Merci Matt

Répondre

1

En mettant en œuvre HttpSessionListener (example), vous pouvez surveiller lors de sessions sont créées et détruites.

Je recommande d'avoir un champ user_id dans la session et d'ajouter des sessions à une carte lors de sa création.

Vous comparez les nouvelles sessions avec celles de cette carte et assurez-vous que les ID utilisateur ne sont pas identiques.

Si elles sont les mêmes, l'utilisateur est déjà connecté, donc invalident la nouvelle session, refusant connexion.

+0

Remerciez Pour la réponse, c'est une solution de contournement utile, mais je suis plus intéressé de savoir si cette fonctionnalité a été implémentée et extraite par le framework de guichet plutôt que de l'implémenter moi-même. – Matt

+0

Cela ressemble à une omission. :) – Matt

0

Si je devais le faire, je voudrais essayer quelque chose comme

class MyApplication ... 
{ 
    @Override 
    protected void init() 
    { 
     getRequestCycleListeners().add(new SessionGuard()); 
    } 
} 

class SessionGuard extends AbstractRequestCycleListener 
{ 
    @Override 
    public void onBeginRequest(final RequestCycle cycle) 
    { 
     final MySession session = MySession.class.cast(Session.get()); 

     if(session.isSignedIn()) 
     { 
      final String validSessionId = session.getUser().getLastAuthenticatedSessionId(); 

      if(!session.getId().equals(validSessionId)) 
      { 
       session.invalidate(); 
      } 
     } 
    } 
}