1
我在需要身份驗證的新項目上使用GWT和RequestFactory。GWT RequestFactory身份驗證功能
哪裏會是添加登錄和註銷功能的最佳地點?在UserRequestContext中?
在此先感謝。
我在需要身份驗證的新項目上使用GWT和RequestFactory。GWT RequestFactory身份驗證功能
哪裏會是添加登錄和註銷功能的最佳地點?在UserRequestContext中?
在此先感謝。
使用servlet過濾器。
我將RequestFactory調用分成兩個流 - 一個用於未經身份驗證的調用,另一個用於已驗證的調用。這是我的一塊web.xml
。
<servlet>
<servlet-name>CustomRequestFactoryServlet</servlet-name>
<servlet-class>my.server.CustomRequestFactoryServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CustomRequestFactoryServlet</servlet-name>
<url-pattern>/gwtRequest</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>CustomRequestFactoryServlet</servlet-name>
<url-pattern>/gwtRequestAuth</url-pattern>
</servlet-mapping>
然後創建Servlet過濾器,看起來像這樣:
public class GaeAuthFilter implements Filter
{
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
{
UserService userService = UserServiceFactory.getUserService();
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
if (!userService.isUserLoggedIn())
{
String returnURI = "/";
String requestURI = request.getRequestURI();
String refererURI = request.getHeader("Referer");
if (requestURI.equals("/gwtRequestAuth"))
{
if (refererURI != null)
returnURI = refererURI;
} else
returnURI = requestURI;
response.setHeader("login", userService.createLoginURL(returnURI));
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
return;
}
LoginService.login(request);
filterChain.doFilter(request, response);
}
}
正如你可以看到我設置login
的HTTP標頭的URL AUTH網頁。
在客戶端代碼中,我通過實現我自己的DefaultRequestTransport看起來IKE在此攔截它:
public class GaeAuthRequestTransport extends DefaultRequestTransport
{
private final EventBus eventBus;
public GaeAuthRequestTransport(EventBus eventBus)
{
this.eventBus = eventBus;
}
@Override
protected RequestCallback createRequestCallback(final TransportReceiver receiver)
{
final RequestCallback superCallback = super.createRequestCallback(receiver);
return new RequestCallback()
{
public void onResponseReceived(Request request, Response response)
{
if (Response.SC_UNAUTHORIZED == response.getStatusCode())
{
String loginUrl = response.getHeader("login");
if (loginUrl != null)
{
receiver.onTransportFailure(new ServerFailure(
"Unauthenticated user", null, null, false /* not fatal */));
eventBus.fireEvent(new GaeAuthenticationFailureEvent(loginUrl));
return;
}
}
superCallback.onResponseReceived(request, response);
}
public void onError(Request request, Throwable exception)
{
superCallback.onError(request, exception);
}
};
}
}
燃燒事件在導航瀏覽器登錄URL的客戶端代碼處理。
就是這樣。
感謝您的回答。我可以用你用來分隔受保護和不受保護的數據的方式。但我的問題更多地涉及這些認證功能的位置。你會建議將它們添加到您的用戶EntityProxy或添加到其他地方?在專門的ValueProxy中? – Manu 2012-04-17 18:54:40
有很多選項。你可以像上面我的例子那樣有單獨的登錄頁面。或者你可以在你的RequestContext接口中創建login()/ logout()函數。第一個選擇是更老的學校,第二個選項是更多的AJAX :) – expert 2012-04-18 00:48:40
謝謝ruslan。好吧,我必須承認我的第一個問題不是很清楚,但我想使用requestfactory來進行認證功能。因此,我正在談論你的第二種選擇,並明確我正在尋找最佳實踐來實現這一目標。 – Manu 2012-04-19 15:44:32