0

我们有一个使用 Acegi 安全性的 JSF Web 应用程序。我们还有一个独立的 Java Swing 应用程序。Swing 应用程序的一项功能是在浏览器窗口中加载用户的主页。

为此,我们目前正在使用 Commons HttpClient 对 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);
}

这将返回一个 HTTP 302 重定向响应,我们从中获取重定向 url 并使用 BrowserLauncher 2 打开它。该 url 包含新的会话 ID,类似于:

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

我们看到的问题是 Acegi 处理重定向但抛出 AuthenticationCredentialsNotFoundException。似乎由于某种原因无法在安全上下文中找到经过身份验证的凭据。

有谁知道为什么会这样?如果有人需要更多信息,那么我很乐意提供帮助。

非常感谢,

理查德

4

2 回答 2

1

我从来没有做过 Acegi/SpringSecurity,但症状很明显:请求中缺少一些重要信息。如果没有需要在后续请求的标头中传回的新内容,您至少需要调查所有响应标头。可能是另一个代表 Acegi 凭据的 cookie 条目。

但另一个需要注意的是,实际上您不能只在本地浏览器实例中打开 URL,因为无法传递必要的请求标头。您需要让 Swing 应用程序充当内置网络浏览器。例如,获取 HTML 响应InputStream并以某种方式在 Swing 框架中呈现/显示它。我会检查是否还没有现有的 API,因为它涉及的工作比你最初想象的要多得多..(轻描淡写)。

于 2010-01-13T16:18:49.927 回答
0

在这种情况下,您可以进行基本身份验证并在每个请求中设置此标头,而不是发送jsessionid

AUTHORIZATION:Basic VVNFUk5BTUU6UEFTU1dPUkQ=

令牌VVNFUk5BTUU6UEFTU1dPUkQ=是用户名和密码编码的 base64。
例子:

scott:tiger 

是:

c2NvdHQ6dGlnZXI=

还有一件事:使用 SSL。

于 2010-01-13T20:23:00.400 回答