2012-04-06 50 views
1

我在需要身份驗證的新項目上使用GWT和RequestFactory。GWT RequestFactory身份驗證功能

哪裏會是添加登錄和註銷功能的最佳地點?在UserRequestContext中?

在此先感謝。

回答

4

使用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的客戶端代碼處理。

就是這樣。

+0

感謝您的回答。我可以用你用來分隔受保護和不受保護的數據的方式。但我的問題更多地涉及這些認證功能的位置。你會建議將它們添加到您的用戶EntityProxy或添加到其他地方?在專門的ValueProxy中? – Manu 2012-04-17 18:54:40

+0

有很多選項。你可以像上面我的例子那樣有單獨的登錄頁面。或者你可以在你的RequestContext接口中創建login()/ logout()函數。第一個選擇是更老的學校,第二個選項是更多的AJAX :) – expert 2012-04-18 00:48:40

+1

謝謝ruslan。好吧,我必須承認我的第一個問題不是很清楚,但我想使用requestfactory來進行認證功能。因此,我正在談論你的第二種選擇,並明確我正在尋找最佳實踐來實現這一目標。 – Manu 2012-04-19 15:44:32