使用 Java 认证和授权服务(JAAS)可以定制应用程序登录。
使用本主题开发带 Java 认证和授权服务的程序化登录
JAAS 替换公共对象请求代理体系结构(CORBA)程序化登录应用程序编程接口(API)。
由于 JAAS V1.0 中的设计疏忽,javax.security.auth.Subject.getSubject 方法在 java.security.AccessController.doPrivileged 代码块中不返回与正在运行的线程相关联的主体集。此疏忽可能呈现出不一致的行为,这可能会导致意外的结果。com.ibm.websphere.security.auth.WSSubject 类提供了使主体集与正在运行的线程相关联的变通方法。com.ibm.websphere.security.auth.WSSubject 类将 JAAS 模型扩展到 Java 2 Platform, Enterprise Edition(J2EE)资源授权检查。如果主体集与 com.ibm.websphere.security.auth.WSSubject.doAs 方法中正在运行的线程相关联,或者com.ibm.websphere.security.auth.WSSubject.doAsPrivileged 代码块包含代码产品凭证,那么主体集用于 J2EE 资源授权检查。
WebSphere Application Server 为应用程序提供 JAAS 登录配置,以便对 WebSphere 安全性运行时执行程序化认证。这些配置根据提供的认证数据对 WebSphere Application Server 已配置的认证机制(简单 WebSphere 认证机制(SWAM)或轻量级第三方认证(LTPA))和用户注册表(本地操作系统、轻量级目录访问协议或定制)执行认证。来自这些 JAAS 登录配置的已认证主体集包含 WebSphere 安全性运行时可以用来对 J2EE 基于角色的受保护资源执行授权检查的必需主体和凭证。
用前面提到的 JAAS 登录配置认证的主体集包含 com.ibm.websphere.security.auth.WSPrincipal 主体和 com.ibm.websphere.security.cred.WSCredential 凭证。如果在 com.ibm.websphere.security.auth.WSSubject.doAs 或其他 doAs 方法中传递已认证的主体集,那么产品安全性运行时可以根据 com.ibm.websphere.security.cred.WSCredential 主体集对 J2EE 资源执行授权检查。
可以定义其他 JAAS 登录配置来执行程序化登录,这将在客户机或服务器进程中创建定制主体集。主体集中需要某些凭证和主体,以便产品安全性运行时使用此主体集从客户机通过协议发送认证信息,或者使用它在服务器上处理授权。根据提供的登录模块生成必需凭证。
当程序化登录发生在纯 Java 客户机并且属性 com.ibm.CORBA.validateBasicAuth 等于 true 时,安全性代码必须知道 SecurityServer 驻留的位置。通常,当 java.naming.provider.url 属性设置为系统属性或在 jndi.properties 文件中设置了该属性时,缺省 InitialContext 是足够的。在其他情况下,不希望在系统范围作用域中设置相同的 java.naming.provider.url 属性。在这种情况下,需要在 sas.client.props 文件中指定特定于安全性的引导信息。以下步骤提供了确定如何在纯 Java 客户机中查找 SecurityServer 的优先顺序:
LoginContext lc = null; Subject subject = null; try { lc = new LoginContext("WSLogin", new WSCallbackHandlerImpl("userName", "password")); } catch (LoginException le) { System.out.println("Cannot create LoginContext. " + le.getMessage()); // Insert the error processing code } catch(SecurityException se) { // Insert the error processing code } try { lc.login(); subject = lc.getSubject(); // setting the subject on the thread to use for outbound requests. // Note: This overrides the existing subject which you might want to save first. com.ibm.websphere.security.auth.WSSubject.setRunAsSubject(subject); } catch (LoginException le) { System.out.println("Fails to create Subject. " + le.getMessage()); // Insert the error processing code }
可使用管理控制台添加和修改新的 JAAS 登录配置。更改保存在单元级安全文档中,并且可供所有受管应用程序服务器使用。
Java 认证和授权服务(JAAS)是 WebSphere Application Server 中的一项功能。JAAS 是 WebSphere Application Server 战略认证 API 集合,它替换了公共对象请求代理体系结构(CORBA)程序化登录 API。
如果您不想使用代理 LoginModule 模块,那么可以将 LoginModule 模块放在 app_server_root/lib/ext/ 目录中。但是,由于安全风险问题,建议您不要这样做。
JAAS 登录配置是在 WebSphere Application Server 配置应用程序编程接口(API)安全性文档中定义的。单击安全性 > 全局安全性。在“认证”下,单击 JAAS 配置 > 应用程序登录。提供了下列 JAAS 登录配置:
可使用管理控制台添加和修改新的 JAAS 登录配置。更改保存在单元级安全文档中,并且可供所有受管应用程序服务器使用。要使更改在运行时生效,需要重新启动应用程序服务器。
但是,app_server_root/properties/wsjaas.conf 文件中定义的新 JAAS 登录配置不会自动刷新。重新启动应用程序服务器以验证更改。这些 JAAS 登录配置特定于特定的节点,不可供其他节点上运行的其他应用程序服务器使用。
如示例中所示,新的登录上下文是使用 WSLogin 登录配置和 WSCallbackHandlerImpl 回调处理程序初始化的。在不需要提示的服务器端应用程序上使用 WSCallbackHandlerImpl 实例。WSCallbackHandlerImpl 是通过指定的用户标识、密码和域信息来初始化的。目前,由 WSLogin 登录配置指定的当前 WSLoginModuleImpl 类实现只能检索来自指定回调处理程序的认证信息。可使用主体集对象构造登录上下文,但是主体集会被当前的 WSLoginModuleImpl 实现所忽视。对于产品客户机容器应用程序,用 ClientContainer 登录配置(指定针对客户机容器要求而定制的 WSClientLoginModuleImpl 实现)替换 WSLogin 登录配置。
对于纯 Java 应用程序客户机,产品提供其他两个回调处理程序实现:WSStdinCallbackHandlerImpl 和 WSGUICallbackHandlerImpl,这两个实现将分别在命令行和弹出面板上提示输入用户标识、密码和域信息。可根据特定应用程序环境选择这两个产品回调处理程序实现中的任一个。如果这两个实现都不适合特定的应用程序要求,那么可以开发新的回调处理程序。
如果缺省 WSLoginModuleImpl 实现无法满足所有要求,也可以开发您自己的登录模块。此产品提供了可供定制登录模块使用的实用程序功能,这在下一部分中描述。
如果 java.naming.provider.url 属性未设置为系统属性,或者在 jndi.properties 文件中不存在该属性,那么当产品服务器不在 localhost:2809 位置时,缺省 InitialContext 上下文将无法正常工作。在这种情况下,应在 JAAS 登录前以编程方式构造新的 InitialContext 上下文。JAAS 需要知道安全服务器驻留在何处,以便在执行落实方法前验证输入的用户标识或密码是否正确。通过按下面指定的方法来构造新的 InitialContext 上下文,安全性代码就有了查找安全服务器位置和目标域所需要的信息。
import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; ... // Perform an InitialContext and default lookup prior to logging in so that target realm // and bootstrap host/port can be determined for SecurityServer lookup. Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"); env.put(Context.PROVIDER_URL, "corbaloc:iiop:myhost.mycompany.com:2809"); Context initialContext = new InitialContext(env); Object obj = initialContext.lookup(""); LoginContext lc = null; try { lc = new LoginContext("WSLogin", new WSCallbackHandlerImpl("userName", "realm", "password")); } catch (LoginException le) { System.out.println("Cannot create LoginContext. " + le.getMessage()); // insert error processing code } catch(SecurityException se) { System.out.printlin("Cannot create LoginContext." + se.getMessage(); // Insert error processing } try { lc.login(); } catch (LoginException le) { System.out.printlin("Fails to create Subject. " + le.getMessage()); // Insert error processing code }
使用 Java 认证和授权服务(JAAS)登录框架,可创建用于执行登录至标识声明的 JAAS 登录配置。
com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule.state
(它包括如下项)
com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule.trusted
(如果可信,那么设置为 true,如果不可信,那么设置为 false)
com.ibm.wsspi.security.common.auth.module.IdenityAssertionLoginModule.principal
(包含身份的主体)
com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule.certificates
(包含身份的证书)
com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule.trusted
(为 true 时指示可信,为 false 时指示不可信)
com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule.principal
(包含要登录的身份的主体,如果使用主体的话)
com.ibm.wsspi.security.common.auth.module.IdentityAssertionLoginModule.certificates
(包含一组证书链,而该证书链包含要登录的身份,如果使用证书的话)
如果缺少状态、信任或标识信息,那么会返回 WSLoginFailedException。然后,登录模块执行身份登录,并且该主题将包含新身份
WebSphere Application Server 支持将定制 Java 认证和授权服务(JAAS)登录模块插入到 WebSphere Application Server 系统登录模块之前或之后。然而,WebSphere Application Server 不支持替换 WebSphere Application Server 系统登录模块,这些模块用于创建主体集中的 WSCredential 凭证和 WSPrincipal 凭证。通过使用定制登录模块,您可以作出其他认证决策,也可以将信息添加到主体集中以便在 Java 2 Platform, Enterprise Edition(J2EE)应用程序中作出其他潜在的细粒度授权决策。
WebSphere Application Server 使您能传播由定制登录模块添加到主体集的信息下游。有关更多信息,请参阅安全性属性传播 。要确定插入定制登录模块时要使用的登录配置,请参阅Java 认证和授权服务的系统登录配置条目设置 中的登录配置描述。
WebSphere Application Server 支持通过管理控制台和使用 wsadmin 脚本编制实用程序修改系统登录配置。要使用管理控制台来配置系统登录配置,请单击安全性 > 全局安全性。在“认证”下,单击 JAAS 配置 > 系统登录。
定制登录模块可以读取应用程序名和 HttpServletRequest 对象以执行映射功能。定制登录模块可以修改基于表单的登录的错误页面。除 JAAS 框架以外,WebSphere Application Server 还支持信任关联接口(TAI)。
在认证过程中,可以使用定制登录模块来将其他凭证类型和信息添加到调用者主体集。调用者主体集中的第三方凭证由 WebSphere Application Server 作为安全上下文的一部分管理。在处理请求期间,调用者主体集与正在运行的线程绑定。当将 Web 或 Enterprise JavaBeans(EJB)模块配置为使用调用者标识时,会将用户标识传播到 EJB 请求中的下游服务。不会将调用者主体集中的 WSCredential 凭证和任何第三方凭证向下游传播。一些信息可改为根据已传播的标识在目标服务器重新生成。将第三方凭证在认证阶段添加到调用者主体集。从 WSSubject.getCallerSubject 方法返回的调用者主体集是只读的,因而不能修改。有关 WSSubject 主体集的更多信息,请参阅“从线程获取调用者主体集的示例”。
通过启用带信任验证的标识声明,应用程序可以使用 JAAS 登录配置来执行程序化标识声明。
MyCallbackHandler handler = new MyCallbackHandler(new MyPrincipal(“Joe”)); LoginContext lc = new LoginContext(“MyAppLoginConfig”, handler); lc.login(); //assume successful Subject s = lc.getSubject(); WSSubject.setRunAsSubject(s); // From here on, the runas identity is “Joe”