9.3. 使用 OpenID Connect 与红帽单点登录保护应用程序


您可以使用 OpenID Connect (OIDC)将身份验证委派给外部 OpenID 供应商。elytron-oidc-client 子系统在 JBoss EAP 中提供原生 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>
    Copy to Clipboard Toggle word wrap

    Example

    $ /home/servers/rh-sso-7.4/bin/standalone.sh -Djboss.socket.binding.port-offset=100
    Copy to Clipboard Toggle word wrap

  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
    }
    Copy to Clipboard Toggle word wrap

    在将 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
    Copy to Clipboard Toggle word wrap
  12. Clients,点 my_jbeap 旁边的 Edit 来编辑客户端设置。
  13. Valid Redirect URI 中,输入身份验证成功后页面应重定向的 URL。

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

9.3.2. 配置 Maven 项目以创建安全应用程序

创建一个具有所需依赖项的 Maven 项目,以及用于创建安全应用程序的目录结构。

先决条件

流程

  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
    Copy to Clipboard Toggle word wrap

    Example

    $ mvn archetype:generate \
    -DgroupId=com.example.oidc \
    -DartifactId=simple-oidc-example \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-webapp \
    -DinteractiveMode=false
    Copy to Clipboard Toggle word wrap

  2. 进入到应用程序根目录:

    语法

    $ cd <name-of-your-application>
    Copy to Clipboard Toggle word wrap

    Example

    $ cd simple-oidc-example
    Copy to Clipboard Toggle word wrap

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

    1. 设置以下属性:

      <properties>
          <maven.compiler.source>1.8</maven.compiler.source>
          <maven.compiler.target>1.8</maven.compiler.target>
          <failOnMissingWebXml>false</failOnMissingWebXml>
          <version.server.bom>4.0.0.GA</version.server.bom>
          <version.server.bootable-jar>4.0.0.GA</version.server.bootable-jar>
          <version.wildfly-jar.maven.plugin>4.0.0.GA</version.wildfly-jar.maven.plugin>
      </properties>
      Copy to Clipboard Toggle word wrap
    2. 设置以下依赖项:

      <dependencies>
          <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0.redhat-1</version>
            <scope>provided</scope>
          </dependency>
      </dependencies>
      Copy to Clipboard Toggle word wrap
    3. 将以下构建配置设置为使用 mvn widlfy:deploy 来部署应用程序:

      <build>
          <finalName>${project.artifactId}</finalName>
          <plugins>
              <plugin>
                  <groupId>org.wildfly.plugins</groupId>
                  <artifactId>wildfly-maven-plugin</artifactId>
                  <version>2.1.0.Final</version>
              </plugin>
          </plugins>
      </build>
      Copy to Clipboard Toggle word wrap

验证

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

    $ mvn install
    Copy to Clipboard Toggle word wrap

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

    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 1.440 s
    [INFO] Finished at: 2021-12-27T14:45:12+05:30
    [INFO] ------------------------------------------------------------------------
    Copy to Clipboard Toggle word wrap

现在,您可以创建安全应用程序。

9.3.3. 创建使用 OpenID Connect 的安全应用程序

您可以通过更新其部署配置或配置 elytron-oidc-client 子系统来保护应用。以下示例演示了创建一个显示已登录用户的 Principal 的 servlet。对于现有应用,仅需要与更新部署配置或 elytron-oidc-client 子系统相关的步骤。

在本例中,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
    Copy to Clipboard Toggle word wrap

    Example

    $ mkdir -p simple-oidc-example/src/main/java/com/example/oidc
    Copy to Clipboard Toggle word wrap

  2. 前往新目录。

    语法

    $ cd <application_root>/src/main/java/com/example/oidc
    Copy to Clipboard Toggle word wrap

    Example

    $ cd simple-oidc-example/src/main/java/com/example/oidc
    Copy to Clipboard Toggle word wrap

  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>");
            }
        }
    
    }
    Copy to Clipboard Toggle word wrap
  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>
    Copy to Clipboard Toggle word wrap
  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
        }
        Copy to Clipboard Toggle word wrap
      2. 使用以下文本更新部署描述符 web.xml 文件,以声明此应用程序使用 OIDC:

        <login-config>
            <auth-method>OIDC</auth-method>
        </login-config>
        Copy to Clipboard Toggle word wrap
    • 配置 elytron-oidc-client 子系统:

      • 要保护应用程序,请使用以下管理 CLI 命令:

        /subsystem=elytron-oidc-client/secure-deployment=simple-oidc-example.war/:add(client-id=my_jbeap,provider-url=http://localhost:8180/auth/realms/example_realm,public-client=true,ssl-required=external)
        Copy to Clipboard Toggle word wrap
  6. 在应用程序根目录中,使用以下命令编译应用程序:

    $ mvn package
    Copy to Clipboard Toggle word wrap
  7. 部署应用。

    $ mvn wildfly:deploy
    Copy to Clipboard Toggle word wrap

验证

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

    username: jane_doe
    password: janedoep@$$
    Copy to Clipboard Toggle word wrap

    您将获得以下输出:

    Secured Servlet
    Current Principal '5cb0c4ca-0477-44c3-bdef-04db04d7e39d'
    Copy to Clipboard Toggle word wrap

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

9.3.4. 根据用户角色限制对应用程序的访问

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

先决条件

流程

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

    语法

    <security-constraint>
        ...
        <auth-constraint>
            <role-name><allowed_role></role-name>
        </auth-constraint>
    </security-constraint>
    Copy to Clipboard Toggle word wrap

    Example

    <security-constraint>
        ...
        <auth-constraint>
            <role-name>example_role</role-name> 
    1
    
        </auth-constraint>
    </security-constraint>
    Copy to Clipboard Toggle word wrap

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

    $ mvn package
    Copy to Clipboard Toggle word wrap
  3. 部署应用。

    $ mvn wildfly:deploy
    Copy to Clipboard Toggle word wrap

验证

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

    username: jane_doe
    password: janedoep@$$
    Copy to Clipboard Toggle word wrap

    您将获得以下输出:

    Forbidden
    Copy to Clipboard Toggle word wrap

    由于您尚未将所需的角色分配给用户 "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@$$
    Copy to Clipboard Toggle word wrap

    您将获得以下输出:

    Secured Servlet
    Current Principal '5cb0c4ca-0477-44c3-bdef-04db04d7e39d'
    Copy to Clipboard Toggle word wrap

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

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部