Employee Workspace 系列第 5/6 部分構建了 Document Management Portlet 存取 DB2 Content Manager (CM),但採用 Credential Vault (憑證保險庫) 存儲用戶名/密碼,存在三大痛點:
解決方案:採用 Light-weight Third Party Authentication (LTPA) Token 實現真正的 Single Sign-On (SSO)。
LtpaToken (含已驗證身份憑證)CMBConnection 非視覺 Bean,支援以 LTPA Token 直接連接 CM Server參考 Lotus Workplace Information Center → Configuring Lotus Workplace products for seamless authentication 啟用 WAS 全域安全與 LTPA,導出 LTPA 金鑰檔。
使用 System Administration Client:
AllowConnectToLogon、AllowTrustedLogon 及業務所需權限 (如 ClientPrint)CMSSO,類型 Basic Portlet,EAR 專案 CMSSOEAR,J2EE Level 1.3 / WebSphere Portal 5.0CMBROOT (CM 安裝路徑) 與 CMBHOME (CM 公共檔案目錄)libcmb81.jar、libcmbsdk81.jar、CMBHOMETConnect.java、TListEntities.java (隨 CM 附贈) 至 cmsso 套件CMSSOPortlet.java 的 actionPerformed() 呼叫 TListEntities.main(new String[]{"ICM","ICMNLSDB","icmadmin","password"})WPSLIB) → 重啟驗證TConnect.java 新增 connect(CMBConnection, String, String, String ltpaToken):
public static void connect(CMBConnection connection, String dstype,
String server, String ltpaToken) throws Exception {
// 解析 server 中的連接字串 (若含括號)
if (server.indexOf("(") > 0) { ... }
connection.setDsType(dstype);
connection.connectWithCredential(server, ltpaToken, "");
connection.setDisplayNamesEnabled(true);
}
TListEntities.java 修改 main() 接受 ltpaToken 參數:
public static void main(String[] args) throws Exception {
String dstype = args[0], server = args[1], ltpaToken = args[2];
CMBConnection connection = new CMBConnection();
CMBSchemaManagement schemaMgmt = connection.getSchemaManagement();
TConnect.connect(connection, dstype, server, ltpaToken);
// ... 列舉實體邏輯不變
}
CMSSOPortlet.java 從 Cookie 擷取 LtpaToken 並傳遞:
Cookie[] cookies = request.getCookies();
String ltpaToken = null;
if (cookies != null) {
for (Cookie c : cookies) {
if ("LtpaToken".equalsIgnoreCase(c.getName())) {
ltpaToken = c.getValue(); break;
}
}
}
String[] args = {"ICM", "ICMNLSDB", ltpaToken};
TListEntities.main(args);
既有 Portlet 連線工具類 ICMConnectDisconnect,需:
TConnect.java 至 com.ibm.bsd.utilconnectWithCredential(String userName, String ltpaToken) 與 getLtpaToken(PortletRequest) 靜態方法getPassWord4CMFromCredential 調用點,替換為:String userId = request.getUser().getUserID();
String ltpaToken = ICMConnectDisconnect.getLtpaToken(request);
DKDatastoreICM store = ICMConnectDisconnect.connectWithCredential(userId, ltpaToken);
sessionBean.setDataStore(store);
本文提供從環境配置、Portlet 雛型開發、核心 API 改造、既有應用遷移的完整鏈路,可直接套用至生產專案。