Acegi lance AuthenticationCredentialsNotFoundException lors de l'ouverture URL avec BrowserLauncher 2

StackOverflow https://stackoverflow.com/questions/2058191

Question

Nous avons une application web JSF qui utilise la sécurité Acegi. Nous avons également une application Swing Java autonome. Une fonction de l'application Swing est de charger la page d'accueil de l'utilisateur dans une fenêtre du navigateur.

Pour ce faire, nous utilisons actuellement Commons HttpClient pour authentifier l'utilisateur avec l'application web:

String url = "http://someUrl/j_acegi_security_check";
HttpClient client = new HttpClient();
System.setProperty(trustStoreType, "Windows-ROOT");
PostMethod  method = new PostMethod(url);
method.addParameter("j_username", "USERNAME");
method.addParameter("j_password", "PASSWORD");
int statusCode = client.executeMethod(method);
if (statusCode == HttpStatus.SC_MOVED_TEMPORARILY ) {
    Header locationHeader= method.getResponseHeader("Location");
    String redirectUrl = locationHeader.getValue();
    BrowserLauncher launcher = new BrowserLauncher();
    launcher.openURLinBrowser(redirectUrl);
}

renvoie une réponse de redirection HTTP 302, à partir de laquelle nous prenons l'URL de redirection et de l'ouvrir à l'aide BrowserLauncher 2. L'URL contient le nouvel ID de session, quelque chose comme:

http://someUrl/HomePage.jsf;jsessionid=C4FB2F643CE48AC2DE4A8A4C354033D4

Le problème que nous voyons est que Acegi traite la redirection mais jette un AuthenticationCredentialsNotFoundException. Il semble que, pour une raison quelconque, les informations d'identification authentifiées ne peuvent pas être trouvées dans le contexte de sécurité.

Quelqu'un at-il une idée de pourquoi cela se passe? Si quelqu'un a besoin de plus d'information alors je serai heureux d'obliger.

Merci,

Richard

Était-ce utile?

La solution

Je ne l'ai jamais fait Acegi / SpringSecurity, mais les symptômes sont assez clairs: certaines informations importantes manquent dans la demande. Vous devez au moins d'enquêter sur tous les en-têtes de réponse s'il n'y a pas quelque chose de nouveau qui besoins à passer en arrière dans l'en-tête de la demande ultérieure. Peut-être une autre entrée cookie qui représente les pouvoirs Acegi.

Mais une autre mise en garde est que vous, en fait, ne peut pas ouvrir simplement l'URL dans une instance locale du navigateur, car il n'y a aucun moyen de passer les en-têtes de demande nécessaires le long de lui. Vous aurez besoin d'avoir votre acte d'application Swing comme un navigateur Web intégré. Par exemple. obtenir une réponse HTML dans un InputStream et rendre / afficher en quelque sorte dans un cadre de Swing. Je voudrais vérifier s'il n'y a pas déjà une API existante pour cela, car il impliquerait beaucoup plus de travail que vous penseriez d'abord .. (euphémisme).

Autres conseils

Dans ce cas, vous pouvez faire l'authentification de base et cet en-tête dans chaque demande au lieu d'envoyer le jsessionid :

AUTHORIZATION:Basic VVNFUk5BTUU6UEFTU1dPUkQ=

Le jeton VVNFUk5BTUU6UEFTU1dPUkQ = est le nom d'utilisateur et le mot de passe base64.
Exemple:

scott:tiger 

est:

c2NvdHQ6dGlnZXI=

Une chose: utiliser SSL

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top