Pergunta

Temos um aplicativo da Web JSF que usa a ACEGI Security. Também temos um aplicativo de balanço Java independente. Uma função do aplicativo Swing é carregar a página inicial do usuário em uma janela do navegador.

Para fazer isso, estamos atualmente usando o Commons HttpClient para autenticar o usuário com o aplicativo da 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);
}

Isso retorna uma resposta de redirecionamento HTTP 302, da qual pegamos o URL de redirecionamento e o abrimos usando o BrowserLauncher 2. O URL contém o novo ID da sessão, algo como:

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

O problema que estamos vendo é que a ACEGI processa o redirecionamento, mas lança uma autenticação que não pode não ser uma exceção. Parece que, por algum motivo, as credenciais autenticadas não podem ser encontradas no contexto de segurança.

Alguém tem uma idéia de por que isso está acontecendo? Se alguém precisar de mais informações, ficarei feliz em obrigar.

Muito Obrigado,

Richard

Foi útil?

Solução

Eu nunca fiz ACEGI/SpringSecurity, mas os sintomas são claros o suficiente: algumas informações importantes estão faltando na solicitação. Você pelo menos precisa investigar todos os cabeçalhos de resposta se não houver algo novo que precisa a ser passado no cabeçalho da solicitação subsequente. Talvez outra entrada de cookies que represente as credenciais da ACEGI.

Mas outra ressalva é que você de fato não pode abrir apenas o URL em uma instância do navegador local, porque não há como passar os cabeçalhos de solicitação necessários ao longo dela. Você precisará que seu aplicativo swing atue como um webbrowser embutido. Por exemplo, obtenha resposta html em um InputStream e renderize/exiba -o de alguma forma em uma estrutura de balanço. Eu verificaria se ainda não existe uma API existente para isso, porque envolveria muito mais trabalho do que você inicialmente pensa .. (eufemismo).

Outras dicas

Nesse caso, você pode fazer autenticação básica e definir este cabeçalho em todas as solicitações, em vez de enviar o JSessionId:

AUTHORIZATION:Basic VVNFUk5BTUU6UEFTU1dPUkQ=

O token Vvnfuk5btuU6ueftu1dpukq = é o nome de usuário e a senha codificada base64.
Exemplo:

scott:tiger 

é:

c2NvdHQ6dGlnZXI=

Mais uma coisa: use SSL.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top