4.2. 使用 Elytron 客户端配置客户端身份验证


连接 JBoss EAP 的客户端(如 Jakarta Enterprise Beans)可以使用 Elytron 客户端进行身份验证。Elytron 客户端是一种客户端框架,使远程客户端能够使用 Elytron 进行身份验证。Elytron Client 有以下组件:

身份验证配置
身份验证配置包含身份验证信息,如用户名、密码、允许 SASL 机制,以及在摘要身份验证期间要使用的安全域。身份验证配置中指定的连接信息会覆盖初始上下文的 PROVIDER_URL 中指定的任何值。
MatchRule
此规则用于决定要使用的身份验证配置。
身份验证上下文
用于建立连接的一组规则和身份验证配置。

建立连接时,客户端使用身份验证上下文。此身份验证上下文包含用于每个出站连接的身份验证配置的规则。例如,您可以在连接 server 2 时具有在连接 server1 时使用一种身份验证配置的规则,以及另一个身份验证配置。身份验证上下文包含一组身份验证配置和一组规则,用于定义在建立连接时如何选择它们。身份验证上下文也可以引用 ssl-context,并可与规则匹配。

在建立连接时创建使用安全信息的客户端:

  • 创建一个或多个身份验证配置。
  • 通过创建规则和身份验证配置对创建身份验证上下文。
  • 为建立连接创建一个可运行。
  • 使用您的身份验证上下文运行您的可运行。

当您建立连接时,Elytron 客户端将使用身份验证上下文提供的一组规则与身份验证期间要使用的正确身份验证配置匹配。

您可以在建立客户端连接时使用以下方法之一:

重要

当使用 Elytron Client 进行 Jakarta Enterprise Beans 调用时,任何硬编码的程序身份验证信息(如在 javax .naming.InitialContext 中设置 context. SECURITY_PRINCIPAL )都会覆盖 Elytron 客户端配置。

4.2.1. 配置文件方法

配置文件方法包括使用您的身份验证配置、身份验证上下文和匹配规则创建 XML 文件。

示例: custom-config.xml

<configuration>
    <authentication-client xmlns="urn:elytron:client:1.2">
        <authentication-rules>
            <rule use-configuration="monitor">
                <match-host name="127.0.0.1" />
            </rule>
            <rule use-configuration="administrator">
                <match-host name="localhost" />
            </rule>
        </authentication-rules>
        <authentication-configurations>
            <configuration name="monitor">
                <sasl-mechanism-selector selector="DIGEST-MD5" />
                <providers>
                  <use-service-loader />
                </providers>
                <set-user-name name="monitor" />
                <credentials>
                    <clear-password password="password1!" />
                </credentials>
                <set-mechanism-realm name="ManagementRealm" />
             </configuration>

             <configuration name="administrator">
                <sasl-mechanism-selector selector="DIGEST-MD5" />
                <providers>
                  <use-service-loader />
                </providers>
                <set-user-name name="administrator" />
                <credentials>
                    <clear-password password="password1!" />
                </credentials>
                <set-mechanism-realm name="ManagementRealm" />
             </configuration>
        </authentication-configurations>
    </authentication-client>
</configuration>

然后,您可以通过在运行客户端时设置系统属性,在客户端的代码中引用该文件。

$ java -Dwildfly.config.url=/path/to/custom-config.xml ...
重要

如果您使用 编程方法,它将覆盖任何提供的配置文件,即使设置了 wildfly.config.url 系统属性。

在创建规则时,您可以查找各种参数(如 主机名端口 协议或 user-name)的 匹配项。Javadocs 中提供了 MatchRule 的完整选项列表。规则按照配置的顺序进行评估。

如果规则中没有包含匹配设置,则整个规则匹配并选择身份验证配置。如果规则中包含多个匹配设置,则所有匹配设置都必须匹配才能选择身份验证配置。

Expand
表 4.1. 通用规则
属性描述

match-local-security-domain

取单个 name 属性来 指定要匹配的本地安全域。

match-host

取单个 name 属性来 指定要匹配的主机名。例如:主机 127.0.0.1 将与 http://127.0.0.1:9990/my/path 上的匹配。

match-no-user

匹配没有用户的 URI。

match-path

取单个 name 属性来指定要匹配的路径。例如:路径 /my/path/ 匹配 http://127.0.0.1:9990/my/path

match-port

取单个 name 属性来 指定要匹配的端口。例如:端口 9990 将与 http://127.0.0.1:9990/my/path 上的匹配。

match-protocol

取单个 name 属性来 指定要匹配的协议。例如:协议 httphttp://127.0.0.1:9990/my/path 上匹配。

match-urn

取单个 name 属性来 指定要匹配的 URN。

match-user

取单个 name 属性来 指定要匹配的 用户

wildfly-config.xml 文件示例可在 示例 wildfly-config.xml 中找到。有关如何配置 wildfly-config.xml 文件的更多信息,请参阅使用 wildfly-config.xml 文件进行客户端配置

4.2.2. 编程方法

编程方法在客户端代码中配置所有 Elytron 客户端配置:

//create your authentication configuration
AuthenticationConfiguration adminConfig =
    AuthenticationConfiguration.empty()
      .useProviders(() -> new Provider[] { new WildFlyElytronProvider() })
      .setSaslMechanismSelector(SaslMechanismSelector.NONE.addMechanism("DIGEST-MD5"))
      .useRealm("ManagementRealm")
      .useName("administrator")
      .usePassword("password1!");

//create your authentication context
AuthenticationContext context = AuthenticationContext.empty();
context = context.with(MatchRule.ALL.matchHost("127.0.0.1"), adminConfig);


//create your runnable for establishing a connection
Runnable runnable =
    new Runnable() {
      public void run() {
        try {
           //Establish your connection and do some work
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    };

//use your authentication context to run your client
context.run(runnable);

AuthenticationConfiguration 和 Authentication Context 中添加配置详情时,每个方法调用都会返回该对象的新实例。例如,如果您在使用不同主机名连接时需要单独的配置,您可以执行以下操作:

//create your authentication configuration
AuthenticationConfiguration commonConfig =
    AuthenticationConfiguration.empty()
      .useProviders(() -> new Provider[] { new WildFlyElytronProvider() })
      .setSaslMechanismSelector(SaslMechanismSelector.NONE.addMechanism("DIGEST-MD5"))
      .useRealm("ManagementRealm");

AuthenticationConfiguration administrator =
    commonConfig
      .useName("administrator")
      .usePassword("password1!");


AuthenticationConfiguration monitor =
    commonConfig
      .useName("monitor")
      .usePassword("password1!");


//create your authentication context
AuthenticationContext context = AuthenticationContext.empty();
context = context.with(MatchRule.ALL.matchHost("127.0.0.1"), administrator);
context = context.with(MatchRule.ALL.matchHost("localhost"), monitor);
Expand
表 4.2. 通用规则
规则描述

matchLocalSecurityDomain(String name)

这与 配置文件方法中的 match-domain 相同。

matchNoUser()

这与 配置文件方法 中的 match-no-user 相同。

matchPath(String pathSpec)

这与 配置文件方法中的 match-path 相同。

matchPort(int port)

这与 配置文件方法中的 match-port 相同。

matchProtocol(String protoName)

这与 配置文件方法中的 match-port 相同。

matchPurpose(String 目的)

创建一个新规则,它与此规则相同,但也与给定目的名称匹配。

matchUrnName(String name)

这与 配置文件方法中的 match-urn 相同。

matchUser(String userSpec)

这与 配置文件方法 中的 match-userinfo 相同。

另外,您可以使用 captureCurrent() 从当前配置的配置开始,而不是从空身份验证配置开始。

//create your authentication configuration
AuthenticationConfiguration commonConfig = AuthenticationConfiguration.captureCurrent();

使用 captureCurrent() 将捕获任何之前建立的身份验证上下文,并将其用作您的新基础配置。通过 调用 run() 激活验证上下文后,就会建立验证上下文。如果名为 captureCurrent(),并且当前没有活跃上下文,它将尝试使用默认验证(如果可用)。您可以在以下部分找到有关此问题的更多详细信息:

AuthenticationConfiguration.empty() 应当仅用作在 上构建配置的基础,不应自行使用。它提供了一个配置,它使用 JVM 范围注册的提供程序并启用匿名身份验证。

AuthenticationConfiguration.empty() 配置上指定提供程序时,您可以指定自定义列表,但大多数用户应使用 WildFlyElytronProvider() 提供程序。

在创建身份验证上下文时,使用 context.with(…​) 将创建一个新上下文,该上下文会将当前上下文中的规则和身份验证配置与所提供的规则和身份验证配置合并。提供的规则和身份验证配置将显示在当前上下文中的后面。

4.2.3. 默认配置方法

默认配置方法完全依赖于 Elytron Client 提供的配置:

//create your runnable for establishing a connection
Runnable runnable =
    new Runnable() {
      public void run() {
        try {
           //Establish your connection and do some work
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    };

// run runnable directly
runnable.run();

为提供默认配置,Elytron 客户端会尝试自动发现文件系统上的 wildfly-config.xml 文件。它位于以下位置:

  • wildfly.config.url 系统属性在客户端代码之外设置的位置。
  • classpath 根目录。
  • 类路径上的 META-INF 目录。
  • 当前用户的主目录。
  • 当前工作目录。

您可以使用以下示例作为客户端 wildfly-config.xml 文件的基本配置。

Basic wildfly-config.xml

<configuration>
  <authentication-client xmlns="urn:elytron:client:1.2">
    <authentication-rules>
      <rule use-configuration="default" />
    </authentication-rules>
    <authentication-configurations>
      <configuration name="default">
        <sasl-mechanism-selector selector="#ALL" />
        <set-mechanism-properties>
          <property key="wildfly.sasl.local-user.quiet-auth" value="true" />
        </set-mechanism-properties>
        <providers>
          <use-service-loader/>
        </providers>
      </configuration>
    </authentication-configurations>
  </authentication-client>
</configuration>

注意

ANONYMOUS 机制不支持 非匿名用户 的授权。这意味着 set-authorization-name 不可用于 Elytron 客户端配置文件中的 set-anonymous。相反,如果您配置 set-authorization-name,还必须为授权身份指定 set-user-name

部署到 JBoss EAP 的客户端还可以利用 Elytron 客户端。AuthenticationContext 会自动从 JBoss EAP 配置 中的 default-authentication-context 设置解析和创建。如果没有配置 default-authentication-context,但您的部署中包含 wildfly-config.xml 文件,或使用 wildfly.config.url 系统属性设置 wildfly.config.url 系统属性,则 AuthenticationContext 会自动从该文件解析和创建。

示例:设置默认身份验证上下文

/subsystem=elytron/authentication-context=AUTH_CONTEXT:add
/subsystem=elytron:write-attribute(name=default-authentication-context,value=AUTH_CONTEXT)

若要在部署外加载配置文件,您可以使用 parseAuthenticationClientConfiguration(URI) 方法。此方法返回 AuthenticationContext,您可以使用 编程方法 在客户端代码中使用它。

此外,客户端还将从 elytron 子系统提供的客户端配置中自动解析和创建 AuthenticationContextelytron 子系统中的客户端配置还可以利用 elytron 子系统中定义的其他组件,如凭据存储。如果客户端配置同时由部署和 elytron 子系统提供,则使用 elytron 子系统的配置。

注意

只有在此 身份验证-context 设为 elytron 子系统的默认值时,才能使用 elytron 子系统中的 AuthenticationContext

从 JBoss EAP 7.1 开始,可使用 wildfly-config.xml 文件配置 Jakarta 管理客户端,包括 JConsole。在启动 Jakarta 管理客户端时,您可以使用 -Dwildfly.config.url 系统属性指定配置文件的文件路径。

-Dwildfly.config.url=path/to/wildfly-config.xml
注意

使用 JConsole 时,-Dwildfly.config.url 系统属性必须加上 -J 前缀,例如:

-J-Dwildfly.config.url=path/to/wildfly-config.xml

如需更多信息,请参阅 JBoss EAP 开发指南 中的使用 wildfly-config.xml 文件进行客户端配置

4.2.6. 使用 ElytronAuthenticator 传播身份

警告

由于 Java 8 中已知的凭证限制,不支持或推荐在 JBoss EAP 中使用 ElytronAuthenticator。在使用此类传播身份时,请注意以下限制:

  • 由于 Java 8 设计的限制,安全身份传播不适用于调用受保护 servlet。
  • 不要在服务器上使用 ElytronAuthenticator,如 Jakarta Enterprise Beans。
  • 凭据缓存可能会影响其在独立客户端 JVM 中的使用。

JBoss EAP 7.1 引入了 ElytronAuthenticator 类,它使用当前安全上下文来执行身份验证。org.wildfly.security.auth.util.ElytronAuthenticator 类是 java.net.Authenticator 实施。

  • 它有一个构造器 ElytronAuthenticator(),用于构建新实例。
  • 它有一个方法 getPasswordAuthentication(),它返回 PasswordAuthentication 实例。

以下是客户端代码示例,它创建并使用 ElytronAuthenticator 类向服务器传播身份:

示例:使用 ElytronAuthenticator 代码

// Create the authentication configuration
AuthenticationConfiguration httpConfig = AuthenticationConfiguration.empty().useName("bob");

// Create the authentication context
AuthenticationContext context = AuthenticationContext.captureCurrent().with(MatchRule.ALL, httpConfig.usePassword(createPassword(httpConfig, "secret")));

String response = context.run((PrivilegedExceptionAction<String>) () -> {
    Authenticator.setDefault(new ElytronAuthenticator());
    HttpURLConnection connection = HttpURLConnection.class.cast(new URL("http://localhost:" + SERVER_PORT).openConnection());
    try (InputStream inputStream = connection.getInputStream()) {
        return new BufferedReader(new InputStreamReader(inputStream)).lines().findFirst().orElse(null);
    }
});

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部