Acegi getta AuthenticationCredentialsNotFoundException durante l'apertura di URL con BrowserLauncher 2

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

Domanda

Abbiamo un'applicazione web JSF che utilizza la protezione Acegi. Abbiamo anche un'applicazione Java Swing standalone. Una funzione delle app swing è quello di caricare la home page dell'utente in una finestra del browser.

Per fare questo stiamo attualmente utilizzando Commons HttpClient per autenticare l'utente con l'applicazione 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);
}

Questo restituisce una risposta di reindirizzamento HTTP 302, da cui prendiamo l'URL di reindirizzamento e aprirlo con BrowserLauncher 2. L'url contiene il nuovo ID di sessione, qualcosa come:

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

Il problema che stiamo vedendo è che Acegi elabora il reindirizzamento, ma genera un AuthenticationCredentialsNotFoundException. Sembra che per qualche motivo autenticate le credenziali non possono essere trovate nel contesto di protezione.

Qualcuno ha un'idea del perché questo sta accadendo? Se qualcuno ha bisogno di più informazioni allora sarò felice di farlo.

Molte grazie,

Richard

È stato utile?

Soluzione

Non ho mai fatto Acegi / SpringSecurity, ma i sintomi sono abbastanza chiare: alcune informazioni importanti manca nella richiesta. È almeno bisogno di indagare su tutte le intestazioni di risposta se non c'è qualcosa di nuovo che ha bisogno da passare indietro nell'intestazione della successiva richiesta. Forse un'altra voce biscotto che rappresenta le credenziali Acegi.

Ma un altro avvertimento è che non si in effetti possibile aprire solo l'URL in un'istanza browser locale, perché non c'è modo di passare le intestazioni di richiesta necessarie lungo di essa. Avrete bisogno di avere il vostro agire applicazione swing come un browser web integrato. Per esempio. ottenere risposta HTML in un InputStream e rendere / visualizzarla in qualche modo in una cornice Swing. Vorrei verificare se non c'è già un'API esistente per questo, perché comporterebbe molto più lavoro di quanto si potrebbe inizialmente pensare .. (eufemismo).

Altri suggerimenti

In questo caso si può fare l'autenticazione di base e impostare questa intestazione in ogni richiesta invece di inviare il jsessionid :

AUTHORIZATION:Basic VVNFUk5BTUU6UEFTU1dPUkQ=

Il token VVNFUk5BTUU6UEFTU1dPUkQ = è il nome utente e la password Base64 codificato.
Esempio:

scott:tiger 

è:

c2NvdHQ6dGlnZXI=

Ancora una cosa: Usa SSL

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top