首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

Employee Workspace 系列:基於 LTPA Token 實現 DB2 Content Manager 8.2 單點登入 Portlet 開發全攻略

     編輯:DB2 教學

背景與挑戰:Portlet 整合的身份驗證難題

Employee Workspace 系列第 5/6 部分構建了 Document Management Portlet 存取 DB2 Content Manager (CM),但採用 Credential Vault (憑證保險庫) 存儲用戶名/密碼,存在三大痛點:

  1. 需提供 UI 讓用戶維護 CM 憑證,增加使用負擔
  2. Portlet 與 CM 共享 LDAP 用戶註冊表時,手工同步憑證極不便利
  3. 明文密碼儲存帶來潛在安全風險

解決方案:採用 Light-weight Third Party Authentication (LTPA) Token 實現真正的 Single Sign-On (SSO)。

架構原理:LTPA Token 如何串聯雙邊

  • Lotus Workplace 2.0.1 運行於 WebSphere Portal 5.0 / WAS 5.1 之上
  • 啟用 WAS LTPA 後,登入用戶的 Cookie 中自帶 LtpaToken (含已驗證身份憑證)
  • DB2 Information Integrator for Content (IIC) Java API 提供 CMBConnection 非視覺 Bean,支援以 LTPA Token 直接連接 CM Server
  • 前提:WAS 與 CM Server 均需啟用 LTPA 並信任同一簽名金鑰

環境配置雙軌並行

Lotus Workplace / WAS 端

參考 Lotus Workplace Information Center → Configuring Lotus Workplace products for seamless authentication 啟用 WAS 全域安全與 LTPA,導出 LTPA 金鑰檔。

DB2 Content Manager 8.2 端

使用 System Administration Client:

  1. 啟用 CM Server 單點登入功能
  2. 建立新權限集:包含 AllowConnectToLogon、AllowTrustedLogon 及業務所需權限 (如 ClientPrint)
  3. 將權限集指派給需 SSO 登入的用戶帳號
  4. 用 eClient 驗證 SSO 是否生效

從零開發 SSO Portlet:逐步實作

1. 建立專案骨架 (WebSphere Studio Application Developer 5.1.2 + Portal Toolkit 5.0.2)

  • File → New → Project → Portlet Development → Portlet Project
  • 專案名 CMSSO,類型 Basic Portlet,EAR 專案 CMSSOEAR,J2EE Level 1.3 / WebSphere Portal 5.0
  • Classpath Variables 新增 CMBROOT (CM 安裝路徑) 與 CMBHOME (CM 公共檔案目錄)
  • 專案 Properties → Java Build Path 加入 libcmb81.jar、libcmbsdk81.jar、CMBHOME

2. 整合 CM 範例程式驗證基本連線

  • Import TConnect.java、TListEntities.java (隨 CM 附贈) 至 cmsso 套件
  • 修改 CMSSOPortlet.java 的 actionPerformed() 呼叫 TListEntities.main(new String[]{"ICM","ICMNLSDB","icmadmin","password"})
  • Export WAR → 部署至 Lotus Workplace → 加入 CM 公共目錄至 WAS Shared Library (WPSLIB) → 重啟驗證

3. 核心改造:注入 LTPA Token 連線邏輯

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);

遷移強化既有 Document Management Portlet

既有 Portlet 連線工具類 ICMConnectDisconnect,需:

  1. 導入 TConnect.java 至 com.ibm.bsd.util
  2. 新增 connectWithCredential(String userName, String ltpaToken) 與 getLtpaToken(PortletRequest) 靜態方法
  3. 搜尋 getPassWord4CMFromCredential 調用點,替換為:
String userId = request.getUser().getUserID();
String ltpaToken = ICMConnectDisconnect.getLtpaToken(request);
DKDatastoreICM store = ICMConnectDisconnect.connectWithCredential(userId, ltpaToken);
sessionBean.setDataStore(store);

部署驗證與總結

  • 重新 Build WAR → 部署 → 以 LDAP 用戶登入 Lotus Workplace → 存取 Portlet 免輸入密碼直達 CM
  • LTPA Token 方案優勢:零憑證維護、無明文密碼、無縫 SSO 體驗
  • 關鍵前提:WAS 與 CM 共享 LTPA 金鑰、用戶身份在 LDAP 中唯一對應

本文提供從環境配置、Portlet 雛型開發、核心 API 改造、既有應用遷移的完整鏈路,可直接套用至生產專案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved