2010-09-16 70 views
2

我正在開發一個GWT + Spring應用程序,我很難將GWT與Spring Security系統集成在一起。GWT身份驗證

服務受春季安全和響應的保護,401未經身份驗證的用戶(匿名)和403未經授權訪問。我的問題在於,我無法讓失敗的AsyncRequests以我想要的方式處理這些錯誤,而無需再次輸入那些未處理的樣板存根。

我設法爲Spring Security開發了我自己的過濾器,該過濾器使用「authorizeform」標頭響應,該標頭攜帶401例外的登錄表單URL。

所以問題是: 有沒有辦法處理401/403全局例外,沒有樣板onFailure代碼並重定向到指定頭的URL?

即將到來的RequestFactory類似於「AuthenticationFailedHandler」,但2.1幾乎完全沒有文檔和「快速開發」,所以它看起來不是一個選項。

在此先感謝!

回答

0

在應用程序級別處理安全失敗的一種非常簡單的方法是爲您的應用程序定義一個抽象回調函數,它將在一個一致的地方處理onFailure樣板文件。對於整個代碼中的每個服務請求,您都可以使用該回調並執行任何特定處理。

public abstract class ServiceCallback<T> implements MethodCallback<T> { 
private ServiceCallbackListener listener; 

public ServiceCallback(ServiceCallbackListener serviceCallbackActions) { 
    this.listener = serviceCallbackActions; 
} 

@Override 
public void onFailure(Method method, Throwable exception) { 
    if (method.getResponse().getStatusCode() == 403 || method.getResponse().getStatusCode() == 401) { 
     listener.onUnAuthorizedAccess(); 
    } else { 
     onError(method, exception); 
    } 
} 

public abstract void onError(Method method, Throwable exception); 
} 

現在,您可以撥打以下方式服務:

service.callToServer(new ServiceCallback<ServiceResponse>(sessionListener) { 
     @Override 
     public void onSuccess(Method method, ServiceResponse response) { 
      Log.debug("It worked!"); 
     } 

     @Override 
     public void onError(Method method, Throwable exception) { 
      Log.debug("Didn't work.. "); 
     } 
    }); 

當然,如果你想的錯誤處理只是在應用層面,你可能要設置的onError到是一個空的主體的非抽象方法。