【发布时间】:2010-12-23 05:22:06
【问题描述】:
我有一个要求,登录页面在弹出窗口中打开主页,
这是我在正常身份验证中的处理方式:
<http>
...
<form-login login-page="/Login.html" authentication-failure-url="/LoginHandler.jsp" always-use-default-target="false" default-target-url="/LoginHandler.jsp"/>
...
</http>
登录页面创建一个 ajax 调用(内部使用 GWT 的请求生成器)并读取响应 html 页面。因此,如果 LoginHandler.jsp 包含“success”,则登录成功, 或者如果 LoginHandler.jsp 包含“失败”,则登录失败。
无论哪种情况,Login.html 都知道身份验证失败或成功,并在成功时打开一个包含主屏幕的弹出窗口。
现在,我需要让我的系统支持 OpenID,如果我理解得很好,open id 身份验证的工作方式如下,如果成功,它将打开成功 url(在我的情况下主要是 LoginHandler.jsp),但是, 如果失败.... 它会打开目标服务器的登录屏幕(例如 google 的登录屏幕),我该如何设计我的代码以在这个场景中工作??
这是我的配置:
<openid-login authentication-failure-url="/LoginHandler.jsp" default-target-url="/LoginHandler.jsp" user-service-ref="openIdUserService"/>
这是我使用 RequestBuilder 登录的方式:
// Encode values for sending as a post request.
String postData = "j_username=" + username
+ "&j_password=" + password
+ ((isRemembered) ? "&_spring_security_remember_me=on" : "");
String serverUrl = URL.encode("j_spring_security_check");
/*
* Authenticate the user using a request builder to send the request to the server.
* <p>on successful authentication, open main screen in a pop up
* */
try
{
RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.POST, URL.encode(serverUrl));
requestBuilder.setHeader("Content-Type", "application/x-www-form-urlencoded");
requestBuilder.sendRequest(postData, new RequestCallback()
{
public void onError(Request request, Throwable exception)
{
//Do nothing
}
public void onResponseReceived(Request request, Response response)
{
String responseText = response.getText();
int indexStart = responseText.indexOf(startMessageIndicator) + startMessageIndicator.length();
int indexEnd = responseText.indexOf(endMessageIndicator);
String text = responseText.substring(indexStart, indexEnd);
//Login was a success
if (text.contains(successMessageIndicator))
{
//Woophie !! code for success comes here.
}
else if (text.contains(errorMessageIndicator))
{
//Ooops ! get the error message encoded in the page
}
}
});
}
catch (RequestException e)
{
//Do nothing
}
有没有办法使用相同的方法进行基于开放 id 的身份验证?
【问题讨论】:
-
我不完全理解你的问题。但如果这对您有所启发,请考虑一下这个 OpenID 登录体验的弹出流程:openidux.dotnetopenauth.net
-
如前所述,我能够进行基于开放 ID 的登录,但我不知道如何以 ajax 样式进行操作
-
我检查了那个链接,我很想知道你是如何实现在新窗口中打开referer的,话虽如此,我认为你正在刷新你的页面......
-
您是如何获得用户的电子邮件 ID 的?
标签: authentication gwt openid popup spring-security