9.4. 使用 OpenID Connect 开发 JBoss EAP bootable jar 应用程序


您可以使用 OpenID Connect (OIDC)将身份验证委派给外部 OpenID 供应商。elytron-oidc-client galleon 层在 JBoss EAP bootable jar 应用程序中提供原生 OIDC 客户端,以与外部 OpenID 供应商连接。

要使用 Red Hat Single Sign-On 创建使用 OpenID Connect 保护的应用程序,请按照以下步骤执行:

Red Hat Single Sign-On 是一个身份和访问管理供应商,用于通过单点登录(SSO)保护 Web 应用程序。它支持 OpenID Connect (OAuth 2.0 的扩展)。

先决条件

流程

  1. 在 8080 之外的端口启动 Red Hat Single Sign-On 服务器,因为 JBoss EAP 默认端口为 8080。

    语法

    $ RH_SSO_HOME/bin/standalone.sh -Djboss.socket.binding.port-offset=<offset-number>

    Example

    $ /home/servers/rh-sso-7.4/bin/standalone.sh -Djboss.socket.binding.port-offset=100

  2. 登录到位于 http://localhost:<port>/auth/ 的管理控制台。例如: http://localhost:8180/auth/
  3. 要创建域,请在管理门户中,将鼠标悬停在 Master 上,然后单击 Add realm
  4. 输入 realm 的名称。例如: example_realm。确保 EnabledON,再单击 Create
  5. Users,然后点 Add user 将用户添加到域中。
  6. 输入用户名。例如,jane_doe。确保 User EnabledON,然后单击 Save
  7. Credentials 为用户添加密码。
  8. 设置用户的密码。例如,janedoep@$$。将 Temporary 切换到 OFF,然后单击 Set Password。在确认提示中,单击 Set password
  9. Clients,然后点 Create 来配置客户端连接。
  10. 输入客户端 ID。例如,my_jbeap。确保将 Client Protocol 设置为 openid-connect,然后单击 Save
  11. Installation,然后选择 Keycloak OIDC JSON 作为 Format Option 来查看连接参数。

    {
      "realm": "example_realm",
      "auth-server-url": "http://localhost:8180/auth/",
      "ssl-required": "external",
      "resource": "my_jbeap",
      "public-client": true,
      "confidential-port": 0
    }

    在将 JBoss EAP 应用程序配置为使用 Red Hat Single Sign-On 作为身份提供程序时,您可以使用参数,如下所示:

    "provider-url" : "http://localhost:8180/auth/realms/example_realm",
    "ssl-required": "external",
    "client-id": "my_jbeap",
    "public-client": true,
    "confidential-port": 0
  12. Clients,点 my_jbeap 旁边的 Edit 来编辑客户端设置。
  13. Valid Redirect URI 中,输入身份验证成功后页面应重定向的 URL。

    在本例中,将此值设置为 http://localhost:8080/simple-oidc-layer-example/secured/*

创建一个具有所需依赖项的 Maven 项目,以及用于创建使用 OpenID Connect 的可引导 jar 应用程序的目录结构。elytron-oidc-client galleon 层提供了一个原生 OpenID Connect (OIDC)客户端来与 OpenID 供应商连接。

先决条件

流程

  1. 使用 mvn 命令建立一个 Maven 项目。该命令创建项目的目录结构以及 pom.xml 配置文件。

    语法

    $ mvn archetype:generate \
    -DgroupId=${group-to-which-your-application-belongs} \
    -DartifactId=${name-of-your-application} \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-webapp \
    -DinteractiveMode=false

    Example

    $ mvn archetype:generate \
    -DgroupId=com.example.oidc \
    -DartifactId=simple-oidc-layer-example \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-webapp \
    -DinteractiveMode=false

  2. 导航到应用程序根目录。

    语法

    $ cd <name-of-your-application>

    Example

    $ cd simple-oidc-layer-example

  3. 更新生成的 pom.xml 文件,如下所示:

    1. 设置以下软件仓库:

      <repositories>
          <repository>
              <id>jboss</id>
              <url>https://maven.repository.redhat.com/ga</url>
              <snapshots>
                  <enabled>false</enabled>
              </snapshots>
          </repository>
      </repositories>
    2. 设置以下插件存储库:

      <pluginRepositories>
          <pluginRepository>
              <id>jboss</id>
              <url>https://maven.repository.redhat.com/ga</url>
              <snapshots>
                  <enabled>false</enabled>
              </snapshots>
          </pluginRepository>
      </pluginRepositories>
    3. 设置以下属性:

      <properties>
          <maven.compiler.source>1.8</maven.compiler.source>
          <maven.compiler.target>1.8</maven.compiler.target>
          <bootable.jar.maven.plugin.version>6.1.2.Final-redhat-00001</bootable.jar.maven.plugin.version>
          <jboss.xp.galleon.feature.pack.version>4.0.0.GA-redhat-00002</jboss.xp.galleon.feature.pack.version>
      </properties>
    4. 设置以下依赖项:

      <dependencies>
          <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0.redhat-1</version>
            <scope>provided</scope>
          </dependency>
      </dependencies>
      
      <dependencyManagement>
          <dependencies>
              <dependency>
                  <groupId>org.jboss.bom</groupId>
                  <artifactId>jboss-eap-jakartaee8</artifactId>
                  <version>7.3.4.GA</version>
                  <type>pom</type>
                  <scope>import</scope>
              </dependency>
              <dependency>
                  <groupId>org.jboss.spec.javax.servlet</groupId>
                  <artifactId>jboss-servlet-api_4.0_spec</artifactId>
                  <scope>provided</scope>
              </dependency>
          </dependencies>
      </dependencyManagement>
    5. pom.xml 文件的 & lt;build > 项中设置以下构建配置:

      <finalName>${project.artifactId}</finalName>
      <plugins>
          <plugin>
              <groupId>org.wildfly.plugins</groupId>
              <artifactId>wildfly-jar-maven-plugin</artifactId>   
      1
      
              <version>${bootable.jar.maven.plugin.version}</version>
              <configuration>
                  <feature-pack-location>org.jboss.eap:wildfly-galleon-pack:${jboss.xp.galleon.feature.pack.version}</feature-pack-location>
                  <layers>
                      <layer>jaxrs-server</layer>
                      <layer>elytron-oidc-client</layer>    
      2
      
                  </layers>
                  <context-root>false</context-root>   
      3
      
              </configuration>
              <executions>
                  <execution>
                      <goals>
                          <goal>package</goal>
                      </goals>
                  </execution>
              </executions>
          </plugin>
      </plugins>
      1
      JBoss EAP Maven 插件,将应用程序构建为可引导 JAR
      2
      elytron-oidc-client 层提供了一个原生 OpenID Connect (OIDC)客户端来与外部 OpenID 供应商连接。
      3
      simple-oidc-layer-example 资源路径中注册应用程序。然后,servlet 位于 URL http://server-url/application_name/servlet_path,例如: http://localhost:8080/simple-oidc-layer-example/secured。默认情况下,应用程序 WAR 文件在 root-context 路径下注册,如 http://server-url/servlet_path,例如: http://localhost:8080/secured
    6. pom.xml 文件的 < build > 元素中设置应用程序名称,如 "simple-oidc-layer-example"。

      <finalName>simple-oidc-layer-example</finalName>

验证

  • 在应用程序根目录中,输入以下命令:

    $ mvn install

    您会看到类似如下的输出:

    ...
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 19.157 s
    [INFO] Finished at: 2022-03-10T09:38:21+05:30
    [INFO] ------------------------------------------------------------------------

现在,您可以创建一个使用 OpenID Connect 的可引导 jar 应用程序

以下示例演示了创建一个显示已登录用户的 Principal 的 servlet。对于现有应用程序,只需要与更新部署配置相关的步骤。

在本例中,Principal 的值来自 OpenID 提供程序的 ID 令牌。默认情况下,Principal 是令牌中的 "sub" 声明的值。您可以在以下之一中指定 ID 令牌中的声明值作为 Principal :

  • elytron-oidc-client 子系统属性 principal-attribute
  • oidc.json 文件。

该流程中的 &lt ;application_root > 表示 pom.xml 文件目录。pom.xml 文件包含应用的 Maven 配置。

先决条件

流程

  1. 创建一个用于存储 Java 文件的目录。

    语法

    $ mkdir -p <application_root>/src/main/java/com/example/oidc

    Example

    $ mkdir -p simple-oidc-layer-example/src/main/java/com/example/oidc

  2. 前往新目录。

    语法

    $ cd <application_root>/src/main/java/com/example/oidc

    Example

    $ cd simple-oidc-layer-example/src/main/java/com/example/oidc

  3. 使用以下内容创建 servlet "SecuredServlet.java":

    package com.example.oidc;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.security.Principal;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * A simple secured HTTP servlet.
     *
     */
    @WebServlet("/secured")
    public class SecuredServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            try (PrintWriter writer = resp.getWriter()) {
                writer.println("<html>");
                writer.println("  <head><title>Secured Servlet</title></head>");
                writer.println("  <body>");
                writer.println("    <h1>Secured Servlet</h1>");
                writer.println("    <p>");
                writer.print(" Current Principal '");
                Principal user = req.getUserPrincipal();
                writer.print(user != null ? user.getName() : "NO AUTHENTICATED USER");
                writer.print("'");
                writer.println("    </p>");
                writer.println("  </body>");
                writer.println("</html>");
            }
        }
    
    }
  4. 在应用的 WEB-INF 目录中的部署描述符 web.xml 文件中添加访问应用程序的安全规则。

    <?xml version="1.0" encoding="UTF-8"?>
    
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
       metadata-complete="false">
    
        <security-constraint>
            <web-resource-collection>
                <web-resource-name>secured</web-resource-name>
                <url-pattern>/secured</url-pattern>
            </web-resource-collection>
            <auth-constraint>
                <role-name>*</role-name>
            </auth-constraint>
        </security-constraint>
    
        <security-role>
            <role-name>*</role-name>
        </security-role>
    </web-app>
  5. 要使用 OpenID Connect 保护应用,可以更新部署配置或配置 elytron-oidc-client 子系统。

    注意

    如果您在部署配置和 elytron-oidc-client 子系统中配置 OpenID Connect,则 elytron-oidc-client 子系统 secure-deployment 属性中的配置优先于应用部署描述符中的配置。

    • 更新部署配置:

      1. WEB-INF 目录中创建 oidc.json 文件,如下所示:

        {
          "provider-url" : "http://localhost:8180/auth/realms/example_realm",
          "ssl-required": "external",
          "client-id": "my_jbeap",
          "public-client": true,
          "confidential-port": 0
        }
      2. 使用以下文本更新部署描述符 web.xml 文件,以声明此应用程序使用 OIDC:

        <login-config>
            <auth-method>OIDC</auth-method>
        </login-config>
    • 配置 elytron-oidc-client 子系统:

      1. 创建一个目录,将 CLI 脚本存储在应用程序根目录中:

        语法

        $ mkdir <application_root>/<cli_script_directory>

        Example

        $ mkdir simple-oidc-layer-example/scripts/

        您可以在 Maven 能够访问应用程序根目录的任意位置创建该目录。

      2. 创建包含以下内容的 CLI 脚本,如 configure-oidc.cli

        /subsystem=elytron-oidc-client/secure-deployment=simple-oidc-layer-example.war:add(client-id=my_jbeap,provider-url=http://localhost:8180/auth/realms/example_realm,public-client=true,ssl-required=external)

        subsystem 命令定义 simple-oidc-layer-example.war 资源,作为在 elytron-oidc-client 子系统中保护的部署。

      3. 在项目 pom.xml 文件中,将以下配置提取添加到现有插件 < configuration> 元素中:

        <cli-sessions>
            <cli-session>
                <script-files>
                    <script>scripts/configure-oidc.cli</script>
                </script-files>
            </cli-session>
        </cli-sessions>
  6. 在应用程序根目录中,使用以下命令编译应用程序:

    $ mvn package
  7. 使用以下命令部署可引导 jar 应用程序:

    语法

    $ java -jar <application_root>/target/simple-oidc-layer-example-bootable.jar

    Example

    $ java -jar simple-oidc-layer-example/target/simple-oidc-layer-example-bootable.jar

    这将启动 JBoss EAP 并部署应用程序。

验证

  1. 在一个浏览器中,导航到 http://localhost:8080/simple-oidc-layer-example/secured
  2. 使用您的凭证登录。例如:

    username: jane_doe
    password: janedoep@$$

    您将获得以下输出:

    Secured Servlet
    Current Principal '5cb0c4ca-0477-44c3-bdef-04db04d7e39d'

    现在,您可以使用您在 Red Hat Single Sign-On 中配置的凭证作为 OpenID 供应商登录到应用程序。

您可以根据用户角色限制对应用程序的所有或部分的访问。例如,您可以让具有"public"角色的用户能够访问您应用程序的部分不敏感,并授予用户对那些部分的"admin"角色访问权限。

先决条件

流程

  1. 使用以下文本更新部署描述符 web.xml 文件:

    语法

    <security-constraint>
        ...
        <auth-constraint>
            <role-name><allowed_role></role-name>
        </auth-constraint>
    </security-constraint>

    Example

    <security-constraint>
        ...
        <auth-constraint>
            <role-name>example_role</role-name> 
    1
    
        </auth-constraint>
    </security-constraint>

    1
    仅允许具有 example_role 角色的用户访问您的应用。
  2. 在应用程序根目录中,使用以下命令重新编译应用程序:

    $ mvn package
  3. 部署应用。

    $ java -jar simple-oidc-layer-example/target/simple-oidc-layer-example-bootable.jar

    这将启动 JBoss EAP 并部署应用程序。

验证

  1. 在浏览器中,导航到 \localhost:8080/simple-oidc-layer-example/secured
  2. 使用您的凭证登录。例如:

    username: jane_doe
    password: janedoep@$$

    您将获得以下输出:

    Forbidden

    由于您尚未将所需的角色分配给用户 "jane_doe," jane_doe 无法登录到您的应用程序。只有具有所需角色的用户才能登录。

要为用户分配所需的角色,请参阅 在 Red Hat Single Sign-On 中创建和分配角色

Red Hat Single Sign-On 是一个身份和访问管理供应商,用于通过单点登录(SSO)保护您的 Web 应用程序。您可以在 Red Hat Single Sign-On 中定义用户并分配角色。

先决条件

流程

  1. 登录到位于 http://localhost:<port>/auth/ 的 admin 控制台。例如: http://localhost:8180/auth/
  2. 单击用于与 JBoss EAP 连接的域。例如: example_realm
  3. 单击 Clients,然后单击您为 JBoss EAP 配置的 client-name。例如,my_jbeap
  4. 单击 Roles,然后单击 Add Role
  5. 输入角色名称,如 example_role,然后单击 Save。这是您在 JBoss EAP 中配置用于授权的角色名称。
  6. 单击 Users然后查看所有用户
  7. 点 ID 来分配您创建的角色。例如,单击 jane_doe 的 ID。
  8. Role Mappings。在 Client Roles 字段中,选择您为 JBoss EAP 配置的 client-name。例如,my_jbeap
  9. Available Roles 中,选择要分配的角色。例如,example_role。单击 Add selected

验证

  1. 在浏览器中,导航到应用 URL。
  2. 使用您的凭证登录。例如:

    username: jane_doe
    password: janedoep@$$

    您将获得以下输出:

    Secured Servlet
    Current Principal '5cb0c4ca-0477-44c3-bdef-04db04d7e39d'

    具有所需角色的用户可以登录到您的应用程序。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部