2015-10-20 74 views
1

在我登錄之前,我可以在我的安全約束目錄之外打任何內容。如果我嘗試去安全約束目錄內的一個位置,它會將我重定向到表單登錄頁面。正如你所期望的那樣。經過身份驗證的用戶已嘗試訪問所擁有的會話

一旦登錄,我就可以開始我的業務,​​並在我的安全約束條件之外和內部尋找資源。

但是,當LTPA令牌到期(仍然有一個活動會話),我試圖去一個無限制的頁面,讓我們說像被重定向到登錄頁面,我得到的標題錯誤。

所以我想弄清楚一些事情: 1.我可以讓LTPA令牌不像我的會話那樣過期嗎? 2.當LTPA令牌執行時,我可以過期嗎? 3.爲什麼我無法匿名訪問不受限制的頁面?很明顯,我的LTPA令牌已過期,並嘗試重定向我登錄。在哪一點失敗。

好吧,所以得到了一個過濾器的地方。過濾器將未登錄的人重定向到登錄頁面。但問題再次是一旦ltpa令牌過期,該行失敗((HttpServletRequest) request).getSession(false)拋出標題中的異常UnauthorizedSessionRequestException。正如你所看到的,我試圖捕捉那個錯誤並且註銷。哪一個,woops,拋出另一個UnauthorizedSessionRequestException。那我該如何不使用會話呢?

@Override 
public void doFilter(final ServletRequest request, final ServletResponse response, 
    final FilterChain chain) throws IOException, ServletException 
{ 
    final String sourceMethod = "doFilter"; 
    if (logger.isLoggable(Level.FINER)) { 
     logger.entering(sourceClass, sourceMethod, new Object[] { request, response, chain }); 
    } 

    try { 
     final HttpSession session = ((HttpServletRequest) request).getSession(false); 
     final UserBean user = (session != null) ? (UserBean) session.getAttribute("userBean") 
      : null; 
     if (user == null || (user != null && !user.isLoggedOn())) { 
      final HttpServletResponse res = (HttpServletResponse) response; 
      res.sendRedirect("../login.jsf"); 
     } 
    } catch (final UnauthorizedSessionRequestException exc) { 
     ((HttpServletRequest) request).logout(); 
     final HttpServletResponse res = (HttpServletResponse) response; 
     res.sendRedirect("../login.jsf"); 
    } catch (final Exception exc) { 
     final ServletException exception = new ServletException(
      "[UserBeanFilter] Exception doFilter.", exc); 
     logger.throwing(sourceClass, sourceMethod, exception); 
     throw exception; 
    } 
    chain.doFilter(request, response); 
    logger.exiting(sourceClass, sourceMethod); 
} 
+0

這個jsf如何關聯?你的問題沒有顯示任何關係 – Kukeltje

+0

這是一個JSF應用程序,我認爲這是相關的信息。 –

+0

如果它與問題相關,這是恰當的。你還可以添加'java','energy','global-warming'(由燃燒運行java所需的化石燃料引起;-))。請刪除它 – Kukeltje

回答

1

我可以得到LTPA令牌不會過期像我的會議?

不幸的是沒有。 LTPA令牌具有固定超時,並且會話具有不活動超時。如果需要,可以將LTPA令牌超時例如延長到8小時以避免過期。

爲什麼我無法匿名訪問無限制的頁面?

因爲它試圖訪問以前與認證用戶關聯的會話。您可以通過禁用Servers > Server Types > WebSphere application servers > server_name > Session management中的Security integration設置來允許匿名訪問會話。

您還可以檢查Security > Global security > Authentication > Web and SIP security > General settings中是否啓用Use available authentication data when an unprotected URI is accessed

它很清楚地認識到我的LTPA令牌已過期並嘗試重定向我登錄。在哪一點失敗。

嘗試在您的登錄頁面禁用會話支持,如果是jsp,則嘗試在頁面中設置<@page session="false">

UPDATE

所以,如果你想成爲預防,可以檢查LTPA失效,並基於該註銷用戶標記過期,例如5分鐘之前之前。當然,如果用戶在5分鐘內不活動,你仍然會得到這個例外,但是對於90%的情況來說,這應該足夠了。

獲得令牌期滿使用下面的代碼(僞代碼):

WSSubject subject = WSSubject.getRunAsSubject(); 
Set<WSCredential> credentials = subject.getPublicCredentials(WSCredential.class); 

for(WSCredential credential : credentials) { 
    // in the most cases you will find only one credential, but if you 
    // want to be sure you can check credential OID 
     System.out.println("Exp date:" + new Date(credential.getExpiration())); 
     System.out.println("userName: " + credential.getSecurityName()); 
     System.out.println("cred: " + credential.getOID()); 

     // if expiration date closer than your threshold - logout user 
     // ... 

} 



OIDs for auth mechanisms 

BasicAuth (GSSUP): oid:2.23.130.1.1.1 
KRB5: OID: 1.2.840.113554.1.2.2 
LTPA: oid:1.3.18.0.2.30.2 

更新2

好吧,我發現你更好的解決方案。

只需設置會話管理器中的下列標誌:

InvalidateOnUnauthorizedSessionRequestException=true

InvalidateOnUnauthorizedSessionRequestException

如果在響應未經授權的請求, 你希望會話此屬性設置爲true經理無效會話而不是 發出UnauthorizedSessionRequestException錯誤消息。

當會話失效時,請求者可以創建一個新會話, ,但不能訪問任何先前保存的會話數據。 該失效允許單個用戶在註銷後繼續處理請求 ,同時仍保護會話數據。

見這裏Session management custom properties

+0

1.我希望有一種方法可以在沒有用戶重新登錄的情況下以編程方式重新生成LTPA令牌。並且使用其他業務應用程序延長羣集的超時時間將會很麻煩。 2.我寧願不開放匿名訪問會話。第二個選項已啓用。如果禁用,則獲得SECJ0369E:使用LTPA時身份驗證失敗。異常是com.ibm.websphere.wim.exception.WIMException。我認爲這是因爲登錄頁面帖子不再獲取認證信息。 3.我正在使用JSF 2.2。我沒有找到像這樣的選項。 –

+0

另外,感謝您的回覆。我也嘗試在網站上添加一個過濾器,這會使登錄頁面上的會話無效。但它看起來像過濾器沒有得到調用之前我得到的錯誤。 –

+0

我試了一些更多的過濾器,並打了一個死衚衕。查看更新的原始帖子。 –

0

對於Webshepre 8.5的詳細信息。轉至服務器>服務器類型> WebSphere應用程序服務器>服務器名稱(服務器)>會話管理(看右邊菜單上) 自定義屬性 - >添加新的特性

Name =InvalidateOnUnauthorizedSessionRequestException 
Value=true. 

保存並重新啓動Eclipse中的服務器。 我在SOAPUI中測試webservice時遇到了這個問題。

相關問題