2010-05-24 6 views
0

J'utilise wicket 1.4.7 + printemps 3.0 + sécurité printemps 3.0sécurité printemps + remember me question + petite porte

problème est: la sécurité Spring authentifie l'utilisateur via cookie (remember-moi un service), mais AuthenticatedWebSession Wicket couldn » t comprendre cela et remplir le panneau de connexion. Comment puis-je le résoudre ?

Merci.

Répondre

1

Assez vieille question, mais je viens de trébucher dessus tout en recherchant exactement le même problème. Donc, si quelqu'un d'autre vient à travers cela, voici ma solution.

Le problème est que AuthenticatedWebSession # isSignedIn() ignore le SecurityContext et vérifie son propre indicateur booléen à la place. Comme il n'est pas possible de surcharger la méthode finale #isSignedIn(), il doit y avoir une solution de contournement. Je suis allé pour synchroniser l'état juste avant Wicket démarre le traitement de la demande actuelle WebRequestCycle personnalisée remplaçant #onBeginRequest():

// MyApplication.java 
public MyApplication extends AuthenticatedWebApplication { 

    // SNIP 

    @Override 
    public RequestCycle newRequestCycle(final Request request, final Response response) { 
    return new WebRequestCycle(this, (WebRequest) request, (WebResponse) response) { 
     @Override 
     protected void onBeginRequest() { 
     MySession.get().updateSignIn(); 
     } 
    }; 
    } 

} 

// MySession.java 
public class MySession extends AuthenticatedWebSession { 

    // SNIP 

    void updateSignIn() { 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    signIn(auth != null && auth.isAuthenticated()); 
    } 

} 

Alternativement, AuthenticatedWebSession et AuthenticatedWebApplication pourraient être abandonnés alltogether comme le reste de portillons-auth-rôles ne les exige pas. Il suffit d'une duplication de code depuis AuthenticatedWebApplication pour que tout fonctionne de la même manière.

Questions connexes