在 Liberty 应用程序客户机容器中配置 JAAS 程序化登录

Liberty 应用程序客户机容器可配置为使用 JAAS 程序化登录。

开始之前

查看在应用程序客户机容器上认证用户的不同方法,并决定程序化登录选项是否为您的环境的最佳选择。有关进一步详细信息,请参阅在 Liberty 应用程序客户机容器上进行认证

关于此任务

程序化登录是一种表单登录类型,它支持使用应用程序表示登录表单来进行认证。此方法要求应用程序开发者收集用户的凭证并认证该用户。此方法使用 JAAS 框架将用户的凭证发送至服务器以进行认证。JAAS 框架包含通过指定 JAAS 登录配置和使用回调处理程序收集用户凭证来创建登录上下文。从登录上下文获取主体集时,可使用 Liberty 安全性 API 在该线程上设置该主体集,它将用于您对服务器的出站调用。
JAAS 登录配置指定登录模块如何用于认证及哪些登录模块用于认证。以下是 Liberty 在客户机上提供的 JAAS 登录配置:
  • WSLogin JAAS 登录配置:一种通用 JAAS 登录配置,Liberty 应用程序客户机容器可使用此配置执行基于用户标识和密码的认证。但是,此配置不支持客户机应用程序模块的部署描述符中指定的 CallbackHandler 处理程序。
  • ClientContainer JAAS 登录配置:此 JAAS 登录配置识别客户机应用程序模块的部署描述符中指定的 CallbackHandler 处理程序(如果已指定)。如果未在该部署描述符中指定处理程序,那么将使用通过程序指定的处理程序。

    JAAS 登录配置指定的登录模块实现某种认证技术。登录模块可使用 javax.security.auth.callback.CallbackHandler 接口收集来自用户的凭证。Liberty 提供 CallbackHandler 接口的非提示实现,此实现称为 com.ibm.websphere.security.auth.callback.WSCallbackHandlerImpl。此实现允许应用程序开发者在应用程序中直接指定凭证而不必提示用户。可通过两种方法指定 CallbackHandler 实现:

    • 通过程序指定实现(作为 javax.security.auth.login.LoginContext 构造函数的自变量);例如:
      LoginContext logincontext = new LoginContext("ClientContainer", new WSCallbackHandlerImpl("user", "password"));
    • 在客户机应用程序模块的部署描述符 (application-client.xml) 中指定实现名称;例如:
      <callbackhandler>com.acme.callbackhandler.WSCallbackHandlerImpl/<callbackhandler>
注: WSLogin 登录配置不识别在部署描述符中指定 CallbackHandler 处理程序的第二个选项。

过程

  1. appSecurityClient-1.0 功能部件添加至 client.xml 文件。
    <feature>appSecurityClient-1.0</feature>
  2. 为客户机配置 SSL:
    1. 可选:使用 securityUtility 命令为客户机创建 SSL 证书;例如:
      securityUtility createSSLCertificate --client=myClient --password=liberty
    2. 建议:使用 securityUtility 命令生成 xor 编码密码。例如,对密码 liberty 进行编码:
      securityUtility encode liberty
    3. keyStore 元素添加至 client.xml 文件。以下示例使用缺省 SSL 配置:
      <keyStore id="defaultKeyStore" password="{xor}MzY9Oi0rJg=="/> <!-- pwd:
      liberty -->
  3. 在应用程序代码中,使用 ClientContainer JAAS 登录配置和 WSCallbackHandlerImpl 回调处理程序创建 Subject
    1. 应用程序发出出站请求之前,添加以下代码。将 userNameuserPassword 更改为目标服务器的用户注册表中的现有用户的有效凭证。
      CallbackHandler wscbh = new WSCallbackHandlerImpl("userName", "userPassword");
      LoginContext ctx = null;
      try {
            ctx = new LoginContext("ClientContainer", wscbh);
      } catch (LoginException le) {
            le.printStackTrace();
      }
      try {
            				ctx.login();
      } catch (LoginException le) {
            le.printStackTrace();
      }
      				Subject subject = ctx.getSubject();
  4. 在线程上设置先前步骤中获取的 Subject,并使用该 Subject 查找 EJB。使用 WSSubject.doAsdoAsPrivilieged API 完成此操作。com.ibm.websphere.security.auth.WSSubject.doAscom.ibm.websphere.security.auth.WSSubject.doAsPrivileged 代码块中的该 Subject 用于 Java™ Platform Enterprise Edition (J2EE) 资源授权检查。
    WSSubject.doAs(subject, new PrivilegedAction() {
        public Object run() { 
               try {
                      //Perform EJB lookup and invocation
               } catch (Exception ex) {
                      ex.printStackTrace();
               }
               return null; 
        }
    });
  5. 如果已在客户机上启用 Java 2 安全性,并且应用程序代码将调用 JAAS 或 Liberty 安全性 API,请将必需的 Java 2 安全性许可权添加至应用程序的 permissions.xml 文件或 client.xml 文件。有关哪些 Liberty 安全性 API 受 Java 2 安全性许可权保护的更多详细信息,请参阅编程接口 (API)。有关进一步详细信息,请参阅 Java 2 安全性

下一步做什么

与在服务器上一样,您可使用定制登录模块来制定更多认证决策,或向主体集添加信息以在客户机应用程序内制定更详细的授权决策。有关进一步详细信息,请参阅在 Liberty 应用程序客户机容器上配置 JAAS 定制登录模块

用于指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: Tuesday, 6 December 2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twlp_config_jaas_prog_login
文件名:twlp_config_jaas_prog_login.html