Sun Java System Message Queue 4.1 发行说明

JAAS 支持

除了基于文件的内置验证机制以及基于 LDAP 的内置验证机制外,Message Queue 还支持 Java 验证和授权服务 (Java Authentication and Authorization Service, JAAS),它允许将各种服务插入到代理中以验证 Message Queue 客户端。本部分介绍了代理为符合 JAAS 的验证服务提供的信息,并且说明了如何配置代理以使用此类服务。

而介绍 JAAS API 则超出了本文档的范围。如果需要了解更多信息,请参考以下资源。

JAAS API 是 J2SE 中的核心 API,因此, 它是 Message Queue 运行环境中的一个不可或缺的组成部分。JAAS 在应用程序和验证机制之间定义了一个抽象层,它无需更改应用程序代码即可插入所需的机制。对于 Message Queue 服务,抽象层位于代理(应用程序)和验证提供者之间。通过设置几个代理属性,您可以插入任何符合 JAAS 的验证服务并升级此服务,而不会产生中断或需要更改代理代码。

如果使用的是基于 JAAS 的验证,则可以使用 JMX 客户端来管理代理,但必须先手动设置 JAAS 支持(通过设置与 JAAS 相关的代理属性),然后才能启动代理。无法使用 JMX API 更改这些属性。

JAAS 元素

图 1–1 显示了 JAAS 的基本元素:JAAS 客户端、符合 JAAS 的验证服务以及 JAAS 配置文件。

图 1–1 JAAS 元素

该图显示了符合 JAAS 的验证所需的元素。介绍该图的文本解释了其内容。

下一部分说明了 Message Queue 服务如何使用这些元素来提供符合 JAAS 的验证。

JAAS 和 Message Queue

下图说明了 Message Queue 代理如何使用 JAAS。它显示了上图所示的 JAAS 模型的更复杂实现。

图 1–2 Message Queue 如何使用 JAAS

该图显示了如何将符合 JAAS 的验证与 Message Queue 一起使用。该图后面的文本解释了其内容。

与更简单的示例所显示的一样,验证服务层与代理是分开的。验证服务包含一个或多个登录模块 (LoginModule) 以及附加验证模块(如果需要)。登录模块在与代理相同的 Java 虚拟机中运行。对于登录模块来说,Message Queue 代理表示为 LogInContext,并通过 CallBackHandler(作为代理运行时代码的一部分)与登录模块进行通信。

验证服务还提供一个 JAAS 配置文件,其中包含登录模块的入口。该配置文件指定了这些模块的使用顺序以及一些使用条件。在代理启动时,JAAS 通过 Java 系统属性 java.security.auth.login.config 或 Java 安全属性文件来查找该配置文件。然后,它根据代理属性 imq.user_repository.jaas.name 的值在 JAAS 配置文件中选择一个入口。该入口指定将用于验证的登录模块。正如图中所示,代理可以使用多个登录模块。(图 1–3 显示了配置文件、登录模块和代理之间的关系。)

代理使用 JAAS 插件验证服务这一情况对 Message Queue 客户端来说仍是完全透明的。客户端继续像以前一样连接到代理,以便传递用户名和密码。反过来,代理使用回调处理程序将此信息传递给验证服务,该服务使用此信息验证用户并返回结果。如果验证成功,代理将允许建立连接;如果失败,客户端运行时环境将返回 JMS 安全异常,客户端必须对其进行处理。

验证 Message Queue 客户端后,如果要进行进一步授权,代理将按正常方式继续操作;它将查看访问控制文件,以确定是否授权经过验证的客户端执行它要完成的操作:访问目的地、使用消息和浏览队列等。

设置符合 JAAS 的验证

设置符合 JAAS 的验证的过程包括设置一些代理和系统属性,以便选择这种验证类型、指定配置文件位置以及指定要使用的登录模块入口。

本部分说明了 JAAS 客户端、登录模块和 JAAS 配置文件是如何相互关联的,然后介绍了设置符合 JAAS 的验证所需的过程。下图显示了配置文件、登录模块和代理之间的关系。

图 1–3 设置 JAAS 支持

该图显示了与 JAAS 相关的文件之间的关系。该图后面的文本解释了其内容。

正如图中所示,JAAS 配置文件 MyJAASCFile.config 包含对几个登录模块(组合在一个入口点中)的引用。代理通过查看 Java 系统属性 java.security.auth.login.config 或 Java 安全属性文件来查找配置文件。要使用的登录模块是通过查看代理属性 imq.user_repository.jaas.name 确定的,该属性指定配置文件中的所需入口。可以在 lib/ext 目录中找到这些模块的类。

要为 Message Queue 设置 JAAS 支持,您必须完成以下步骤。(在开发环境中,可以由开发者完成所有这些步骤。在生产环境中,将由管理员完成其中的某些任务。)

  1. 创建一个或多个用于实现验证服务的登录模块类。下面列出了代理支持的 JAAS 回调类型。

    javax.security.auth.callback.LanguageCallback

    代理使用此回调为验证服务传递代理运行的语言环境。可以使用该值来进行本地化。

    javax.security.auth.callback.NameCallback

    代理使用此回调为验证服务传递 Message Queue 客户端在请求连接时指定的用户名。

    javax.security.auth.callback.TextInputCallback

    TextInputCallback.getPrompt()imq.authentication.type 时,代理使用此回调为验证服务指定 imq.authentication.type 的值。目前,此字段的值只能为 basic。这表示使用 Base-64 密码编码。

    javax.security.auth.callback.PasswordCallback

    代理使用此回调为验证服务传递 Message Queue 客户端在请求连接时指定的密码。

    javax.security.auth.callback.TextOutputCallback

    通过将文本输出记录到代理日志文件中,代理使用此回调为验证服务提供日志记录服务。回调的消息类型 ERRORINFORMATIONWARNING 分别映射到代理日志级别 ERRORINFOWARNING

  2. 使用引用登录模块类的入口创建 JAAS 配置文件,并为 Message Queue 管理员指定此文件的位置。(可以远程查找该文件,并且可以使用 url 指定其位置。)

  3. 记下 JAAS 配置文件中的入口(它引用登录实现类)的名称。

  4. 将用于实现登录模块的类归档为 jar 文件,然后将 jar 文件放在 Message Queue 的 lib/ext 目录中。

  5. 配置与 JAAS 支持相关的代理属性。表 1–2 对此进行了描述。

  6. 设置以下系统属性以指定 JAAS 配置文件的位置。

    java.security.auth.login.config= JAAS_Config_File_Location

    例如,可以在启动代理时指定配置文件。

    imqbrokerd -Djava.security.auth.login.config=JAAS_Config_File_Location

    可以使用其他方法来指定 JAAS 配置文件的位置。有关其他信息,请参见

    http://java.sun.com/j2se/1.5.0/docs/guide/security/jaas/tutorials/LoginConfigFile.html

下表列出了设置 JAAS 支持所需的代理属性。

表 1–2 用于 JAAS 支持的代理属性

属性 

描述 

imq.authentication.type

设置为 basic 以表示使用 Base-64 密码编码。这是 JAAS 验证唯一允许的值。

imq.authentication.basic.user_repository

设置为 jaas 以指定 JAAS 验证。

imq.accesscontrol.type

设置为 file

imq.user_repository.jaas.name

设置为 JAAS 配置文件中的所需入口的名称,该入口引用要用作验证机制的登录模块。这是在步骤 3 中记下的名称。

imq.user_repository.jaas.userPrincipalClass

此属性(由 Message Queue 访问控制使用)指定登录模块中的 java.security.Principal 实现类,代理使用该类来提取主体名称,以表示 Message Queue 访问控制文件中的用户实体。如果未指定此属性,则改用在请求连接时从 Message Queue 客户端传递的用户名。

imq.user_repository.jaas.groupPrincipalClass

此属性(由 Message Queue 访问控制使用)指定登录模块中的 java.security.Principal 实现类,代理使用该类来提取主体名称,以表示 Message Queue 访问控制文件中的组实体。如果未指定此属性,则忽略 Message Queue 访问控制文件中的组规则(如果有)。