Keycloak 15.0.2与WebSphere Portal 6.1集成:如何用SSO Token创建PortalSession
解决Keycloak Token创建WebSphere Portal 6.1会话的方案
针对你的WebSphere Portal 6.1 + WAS 7.0环境,结合现有LTPA SSO体系,通过Keycloak OIDC Token创建PortalSession的核心思路是扩展WebSphere的信任关联拦截器(TAI),完成Token验证、用户映射与Portal会话初始化,具体步骤如下:
一、部署并配置Keycloak适配的Trust Association Interceptor(TAI)
WebSphere旧版本通过TAI处理外部认证系统的身份断言,需部署适配Keycloak OIDC的TAI组件:
- 下载或编译适配WebSphere 7.0的Keycloak TAI包(需兼容JDK 6/7),将其放入Portal服务器的
${WP_PROFILE_ROOT}/lib/ext目录,或配置为共享库关联到Portal应用。 - 在WebSphere管理控制台启用TAI:
- 进入安全 > 全局安全 > 信任关联 > 信任关联拦截器
- 添加新的TAI类,类名参考Keycloak适配包实现(如
org.keycloak.adapters.websphere.KeycloakTAI) - 配置TAI核心参数:
keycloak.auth-server-url:Keycloak服务器地址keycloak.realm:你的Keycloak Realm名称keycloak.resource:Portal对应的Keycloak客户端IDkeycloak.credentials.secret:客户端密钥keycloak.public-key:Keycloak Realm的公钥(用于验证Token签名)
二、验证Keycloak OpenID Token并映射用户属性
TAI需完成Token合法性校验,并将Token中的用户信息映射到Portal用户注册表:
- Token自动验证:TAI会内置校验逻辑,验证Token的签名、有效期、issuer字段,确保Token未被篡改且处于有效状态。
- 用户属性映射:
- 从Token的
sub(用户唯一标识)、preferred_username、email等字段提取用户核心信息。 - 配置TAI的映射规则,将Keycloak用户属性与Portal注册表(如LDAP、本地用户库)的属性匹配(例如将
email映射到Portal的mail属性)。 - 若需自动创建Portal用户(生产环境需谨慎评估),可扩展TAI逻辑,调用Portal的
com.ibm.portal.usermanagement.UserManagementServiceAPI在验证通过后创建用户。
- 从Token的
三、创建PortalSession并设置UserPrinciple
Token验证与用户映射完成后,通过Portal会话API初始化用户会话:
- 构建Portal的
UserPrincipal实例:import com.ibm.portal.auth.UserPrincipal; // portalUserDN为Portal注册表中用户的唯一标识,portalUsername为用户显示名 UserPrincipal userPrincipal = new UserPrincipal(portalUserDN, portalUsername); - 获取并初始化Portal会话:
import com.ibm.portal.session.PortalSession; import com.ibm.portal.session.PortalSessionManager; PortalSessionManager sessionManager = (PortalSessionManager) request.getAttribute(PortalSessionManager.PORTAL_SESSION_MANAGER_ATTRIBUTE); PortalSession portalSession = sessionManager.getPortalSession(request); portalSession.setUserPrincipal(userPrincipal); - 生成LTPA令牌:为兼容现有LTPA SSO体系,需在创建PortalSession后生成LTPA Cookie,确保用户访问WAS应用时无需二次登录:
import com.ibm.websphere.security.ltpa.LTPAToken2; import javax.servlet.http.Cookie; LTPAToken2 ltpaToken = new LTPAToken2(); ltpaToken.setPrincipal(userPrincipal); ltpaToken.setCredentials(new PasswordCredential(userPrincipal.getName(), null)); String ltpaCookieValue = ltpaToken.encode(); // 将LTPA Cookie添加到响应中 response.addCookie(new Cookie("LtpaToken2", ltpaCookieValue));
四、测试与调试
- 开启WebSphere调试日志:在控制台配置日志和跟踪 > 服务器 > 诊断跟踪服务,添加
org.keycloak.adapters.websphere.*和com.ibm.portal.auth.*的调试级别日志,排查Token验证、用户映射与会话创建中的问题。 - 端到端测试:从Keycloak登录后重定向到Portal,检查页面是否显示已登录用户,同时访问WAS应用验证LTPA SSO是否生效。
内容的提问来源于stack exchange,提问作者RSharma
相关产品推荐
相关产品推荐

