Spring Security 3.0:身份验证后的GET请求

时间:2012-02-23 14:46:38

标签: php spring authentication spring-security single-sign-on

我有一个类似Spring Security 3.0 SSO的内置Spring应用程序和一个外部php应用程序,可以对我的SSO服务器进行身份验证。

当用户登录此应用程序时,我也想在php应用程序中验证他/她。

所以我这样做了:

         ....

public class CustomAuthenticationHandler extends SavedRequestAwareAuthenticationSuccessHandler {

@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {

    DefaultHttpClient httpclient = new DefaultHttpClient();
    try {
        HttpGet httpget = new HttpGet("http://localhost/phpapp/signin");
        httpget.setHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0.2) Gecko/20100101 Firefox/10.0.2");
        httpget.setHeader("Connection", "keep-alive");
        httpget.setHeader("Referer", "http://localhost:8080/;jsessionid="+request.getSession().getId());
        httpget.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        httpget.setHeader("Accept-Language", "en-gb,en;q=0.5");
        httpget.setHeader("Accept-Encoding", "gzip, deflate");
        httpget.setHeader("Cookie", "JSESSIONID="+request.getSession().getId());

        HttpResponse res = httpclient.execute(httpget);

    } finally {
        httpclient.getConnectionManager().shutdown();
    }
}
}

在后验证处理程序中,我针对php应用程序的登录创建了一个“GET”请求。 当它被执行时,在请求体中返回不记录用户的“登录页面”。注意我用过:

httpget.setHeader("Referer", "http://localhost:8080/;jsessionid="+request.getSession().getId());

作为当前经过身份验证的jsessionid。

但是如果我在验证后将相同的链接:http://localhost/phpapp/signin作为页面中的正常href链接并单击它就可以正常工作。

知道为什么在过滤器中不能使用相同类型的请求?

1 个答案:

答案 0 :(得分:0)

它很可能与Cookie路径有关。 Cookie与子域,域,路径和端口绑定,因此除非两个应用程序都在http://localhost/phpapp/上运行,否则会遇到问题。您可以尝试修改Spring以不设置cookie的路径或端口元素,即只将其绑定到localhost。

但是我强烈建议您采用另一种方法,例如真正的单点登录系统,而不是尝试在应用之间代理Cookie。