2017-08-11 219 views
0

在我的項目中,我使用Java,Spring安全性和SAML擴展。發生錯誤時,我需要將SAML令牌顯示到我的日誌中。我重寫了SimpleUrlAuthenticationFailureHandler並提供了自己的實現。我可以通過查看傳遞給Spring SAML身份驗證失敗處理程序和日誌記錄

public void onAuthenticationFailure(HttpServletRequest request, 
     HttpServletResponse response, AuthenticationException exception) 

我怎樣才能從onAuthenticationFailure方法的主體內檢索SAML令牌對象檢查異常的類型? onAuthenticationFailure方法是我處理錯誤的中心位置。我想在我的日誌中顯示SAML令牌。我曾嘗試靜態檢索認證對象:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 

我希望從Authentication獲得SAMLCredential,但上面返回null Authentication對象。

我試過的另一件事是重寫AuthenticationException並添加一個自定義String屬性來包含令牌。 AuthenticationException意味着被覆蓋以提供這種定製。這只是部分工作。 「在Spring/SAML API在身份驗證期間調用loadUserBySAML(...)方法後,我可以拋出自定義異常。我將能夠將該令牌存儲在我的自定義異常中,並在稍後參考。這適用於某些類型的例外,如未找到用戶。但是,如果在調用loadUserBySAML(即錯誤的證書或摘要失敗)之前出現問題,我沒有機會拋出自己的自定義異常,除非我重寫更多的Spring/SAML內置類。我寧願不要重寫太多這些類,特別是僅用於日誌記錄。我正在尋找更簡單的東西。

是否有另一種技術我錯過了在onAuthenticationFailure方法的上下文中檢索SAML令牌?

回答

0

您可以在類自動裝配SAMLContextProvide並獲得令牌就像如下:

@Autowired 
public SAMLContextProvider contextProvider; 

則在該方法:

try { 
     SAMLMessageContext context = contextProvider.getLocalEntity(request, response); 
     processor.retrieveMessage(context); 
     SAMLAuthenticationToken token = new SAMLAuthenticationToken(context); 
     SAMLMessageContext credentials = token.getCredentials(); 
     //credentials.getPeerEntityId(); // e.g. for getting IdP entity ID 
    } catch (Exception e) { 
     errorMsg = e.getMessage(); 
    } 

``