2014-09-25 170 views
4

我有幾個AngularJS應用程序都使用Spring/Java和SAML 2.0用於SSO(利用Spring Security SAML擴展)。我的SSO id提供程序是OpenAM,一切正常。但是,我遇到了一種情況,即用戶在一個應用程序內執行全局註銷,但打開了其他選項卡。由於這些是單頁網頁應用程序,因此很多功能仍然可以在孤立選項卡中使用,直到用戶做某件事來調用ajax請求。當然,這些AJAX請求會被Spring Security SAML過濾器攔截,並通過REDIRECT向OpenAM登錄URL觸發認證嘗試。當然,這會在瀏覽器中造成嚴重破壞,因爲AJAX請求不允許重定向到另一個域。此外,我不能對Angular的$ http攔截器做任何事情,因爲這些請求被「取消」,並且$ http錯誤回調函數中沒有可用的質量信息(例如方便的401/403狀態碼)。我只知道請求失敗。處理SAML重定向AJAX請求

我不想假設所有壞的$ http請求都是由於身份驗證問題(並執行$ window.location.reload()),因爲可能有合法的失敗原因。我的首選是禁止Spring安全重定向(到OpenAM登錄頁面)ajax請求,而是發回一個401/403狀態代碼。這將允許我處理$ http攔截器中的錯誤,並且如果它是身份驗證失敗,則執行整頁加載,從而優雅地重定向到登錄頁面,就好像他們第一次訪問該網站一樣。

如何完成此任何想法?

回答

3

負責初始化身份驗證並決定返回HTTP錯誤,執行重定向的bean,...是AuthenticationEntryPoint的實例。爲了改變自己的行爲,你可以:

  • 自定義當前SAMLEntryPoint(延長commence方法),並覆蓋的情況下,請求的默認行爲是從角AJAX調用,所以它返回,而不是執行重定向到一個HTTP錯誤IDP
  • 或定義在Spring上下文中的另一個security:http元素(目前1)之前只覆蓋你的AJAX請求(例如,使用屬性pattern="/api/**"),並使用一個入口點,這表現在你所希望的方式(見Http403ForbiddenEntryPoint
+0

Vladimir ... t回答。我在你回覆的時候發現了同樣的解決方案。由於Spring Security非常抽象(自從我深入研究之後已經有一段時間了),我花了一些時間進行挖掘,但最終我發現它是我需要擴展的SAMLEntryPoint。現在我的角$ http攔截器可以在瀏覽器中正確處理403響應。再次感謝! – 2014-09-26 12:12:56

+1

夥計們感謝你們的指導,如果你們中的一個人能夠拿出一個github示例教程,這對你會有很大的幫助。乾杯。 – 2014-11-20 21:01:40