2015-06-05 113 views
0

在我們的web應用,我們需要存儲的認證令牌(LtpaToken2(的WebSphere),JSESSIONID(Tomcat)的)在成功登錄後,外部數據存儲。我希望在HttpServletRequest對象上登錄後檢索令牌。獲取後HttpServletRequest.login授權令牌()

 LOG.debug("nr of cookies in request " + request.getCookies().length + " response header " + response.getHeaderNames().size()); 
     request.login(employee.getUsername(), employee.getPassword()); 
     URI uri = info.getBaseUri().resolve("/login2"); 
     LOG.debug("new uri is: '"+ uri + "' nr of cookies in request " + request.getCookies().length + " response header " + response.getHeaderNames().size()); 
     // Add the Higgs Cookie 

日誌輸出表明cookie的標頭數不變。是否有另一種方法在登錄完成時獲取同一請求中的身份驗證令牌,這與獨立平臺更適合?我可能會做重定向並從下一個請求中讀取該令牌,但恐怕這會帶來一些額外的安全威脅。

回答

1

你爲什麼要存儲的cookie的原因嗎?由於它在一定的超時後發生變化,因此存儲它不會提供太多價值。下面的代碼可以用來從請求中訪問它。

認證令牌一個cookie不是一個標頭。您可以使用下面的代碼來訪問它(這個代碼在任何頁面驗證成功後):

Cookie cookies[] = request.getCookies(); 
for(Cookie c : cookies){ 
    if("LtpaToken2".equals(c.getName())) { 
     // do something with ltpa cookie 
     out.println(c.getName() + " : " + c.getValue()); 
    } 
} 

UPDATE
要獲得令牌在執行登錄使用下面的代碼的servlet:

Set<Object> credentials = WSSubject.getRunAsSubject().getPrivateCredentials(); 
for (Object credential : credentials) { 
    if(credential instanceof SingleSignonToken) { 
     SingleSignonToken token = (SingleSignonToken)credential; 
     System.out.println(token.getName()); 
     System.out.println(token.getUniqueID()); 
     System.out.println(token.getPrincipal()); 
     System.out.println("LTPA Token encoded: " + Base64.encode(token.getBytes())); 
    } 
} 
+0

這是一個非常好的問題。我們稱之爲管理干擾。我試過你給的解決方案,但是失敗了(我會更新問題)。 –

+0

作爲事實上的WebSphere認證令牌不會超時,用戶可以保持登錄狀態,直到永遠,我們通過存儲的cookie和註冊最後一抹時間等爭奪這顯然我們不是願意花鎳在這個行爲的IBM解決方案。 –

+0

@drjerry是的,它只是在登錄後不能在servlet中工作,對不起,我沒有完全閱讀你的問題。我會更新答案。這可以在成功登錄後的任何頁面中運行。但是關於其他部分,默認情況下,默認有效期爲2小時。之後,你將不得不重新登錄。 – Gas