4.4. 从 maven 二进制文件创建 OpenShift 应用程序,并使用 Red Hat Single Sign-On 对其进行保护


要在 OpenShift 上部署现有应用,您可以使用二进制源功能。

以下示例使用 app-jee-jspservice-jee-jaxrs 快速入门部署 EAP 6.4 / 7.1 JSP 服务应用程序,使用 Red Hat Single Sign-On 进行身份验证。

先决条件

  • 在此之前,已使用以下模板之一部署了 Red Hat Single Sign-On for OpenShift 镜像:
  • sso76-ocp3-postgresql
  • sso76-ocp3-postgresql-persistent
  • sso76-ocp3-x509-postgresql-persistent
  • sso76-ocp4-postgresql
  • sso76-ocp4-postgresql-persistent
  • sso76-ocp4-x509-postgresql-persistent

EAP 6.4 / 7.1 JSP 服务应用需要专门的红帽单点登录域、用户名和密码才能使用红帽单点登录进行身份验证。在为 OpenShift 镜像部署了 Red Hat Single Sign-On 后执行以下步骤:

创建 Red Hat Single Sign-On Realm

  1. 登录红帽单点登录服务器的管理控制台。

    https://secure-sso-sso-app-demo.openshift.example.com/auth/admin

    使用 Red Hat Single Sign-On 管理员用户 的凭据

  2. 将光标悬停在域命名空间(默认为 栏的顶部),然后单击 Add Realm
  3. 输入 realm 名称(本示例使用 demo)并点 Create

复制公钥

在新创建的 演示域中,单击 Keys 选项卡,然后选择 Active 选项卡,然后复制生成的 RSA 的公钥。

注意

默认情况下,Red Hat Single Sign-On for OpenShift 镜像版本 7.6.11 会生成多个密钥,如 HS256RS256AES。要复制 Red Hat Single Sign-On for OpenShift 7.6.11 镜像的公钥信息,请单击 Keys 选项卡,然后选择 Active 选项卡,然后单击 key 表中所在行的公钥按钮,其中密钥的类型与 RSA 匹配。然后选择并复制出现的弹出窗口的内容。

之后,需要部署 启用了 Red Hat Single Sign-On-enabled EAP 6.4 / 7.1 JSP 应用程序的信息。

创建红帽单点登录角色

service-jee-jaxrs Quickstart 通过服务公开三个端点:

  • public - 不需要身份验证。
  • secured - 可以被具有 user 角色的用户调用。
  • admin - 可以由具有 admin 角色的用户调用。

红帽单点登录中创建用户和 admin 角色。这些角色将分配给 Red Hat Single Sign-On 应用用户,以验证对用户应用的访问权限。

  1. 单击 Configure 边栏中的 Roles,以列出此域的角色。

    注意

    这是一个新域,因此只有默认值(offline_accessuma_authorization)角色。

  2. Add Role
  3. 输入角色名称(用户),然后单击保存

admin 角色重复这些步骤。

创建 Red Hat Single Sign-On Realm 管理用户

  1. 单击 Manage sidebar 中的 Users,以查看域的用户信息。
  2. Add User。
  3. 输入一个有效的 Username (本例使用用户 appuser)并点 Save
  4. 编辑用户配置:

    1. 单击用户空间中的 Credentials 选项卡,然后为用户输入一个密码(本例使用密码 apppassword)。
    2. 确保将 Temporary Password 选项设为 Off,以便它不会稍后提示输入密码,然后单击 Reset Password 来设置用户密码。弹出窗口将提示您确认。

4.4.1.2. 将 user 角色分配给 realm 管理用户

执行以下步骤将之前创建的 appuser 用户与 Red Hat Single Sign-On 角色关联:

  1. 单击 Role Mappings,以列出 realm 和 client 角色配置。在 Available Roles 中,选择之前创建的 用户角色,然后点击 Add selected>
  2. Client Roles,从列表中选择 realm-management 条目,在 Available Roles 列表中选择每个记录。

    注意

    您可以通过保留 Ctrl 键并同时点击第一个 模拟 条目来选择多个项目。虽然保留 Ctrl 键和鼠标左键,但按鼠标右键移动至 view-clients 条目的结尾,并确保每个记录已被选中。

  3. Add selected > 将角色分配给客户端。

流程

  1. 为 EAP 6.4 / 7.1 JSP 应用创建一个新项目。

    $ oc new-project eap-app-demo
  2. view 角色添加到 default 服务帐户。这可让服务帐户查看 eap-app-demo 命名空间中的所有资源,这是管理集群所必需的。

    $ oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default
  3. EAP 模板需要 SSL 密钥存储和 JGroups 密钥存储。本例使用 keytool (Java Development Kit 中包含的软件包)为这些密钥存储生成自签名证书。

    1. 为 SSL 密钥存储生成安全密钥(本例使用 password 作为密钥存储的密码)。

      $ keytool -genkeypair \
      -dname "CN=secure-eap-app-eap-app-demo.openshift.example.com" \
      -alias https \
      -storetype JKS \
      -keystore eapkeystore.jks
    2. 为 JGroups 密钥存储生成安全密钥(本例使用 password 作为密钥存储的密码)。

      $ keytool -genseckey \
      -alias jgroups \
      -storetype JCEKS \
      -keystore eapjgroups.jceks
    3. 使用 SSL 和 JGroup 密钥存储文件为 OpenShift 机密生成 EAP 6.4 / 7.1。

      $ oc create secret generic eap-ssl-secret --from-file=eapkeystore.jks
      $ oc create secret generic eap-jgroup-secret --from-file=eapjgroups.jceks
    4. 将 EAP 应用机密添加到 default 服务帐户。

      $ oc secrets link default eap-ssl-secret eap-jgroup-secret

流程

  1. 克隆源代码。

    $ git clone https://github.com/keycloak/keycloak-quickstarts.git

    配置 Red Hat JBoss Middleware Maven 软件仓库

  2. 同时构建 service-jee-jaxrsapp-jee-jsp 应用。

    1. 构建 service-jee-jaxrs 应用。

      $ cd keycloak-quickstarts/service-jee-jaxrs/
      $ mvn clean package -DskipTests
      [INFO] Scanning for projects...
      [INFO]
      [INFO] ------------------------------------------------------------------------
      [INFO] Building Keycloak Quickstart: service-jee-jaxrs 3.1.0.Final
      [INFO] ------------------------------------------------------------------------
      ...
      [INFO] ------------------------------------------------------------------------
      [INFO] BUILD SUCCESS
      [INFO] ------------------------------------------------------------------------
      [INFO] Total time: 2.153 s
      [INFO] Finished at: 2017-06-26T12:06:12+02:00
      [INFO] Final Memory: 25M/241M
      [INFO] ------------------------------------------------------------------------
    2. 注释掉 maven-enforcer-plugin 插件的 app-jee-jsp/config/keycloak.json 要求并构建 app-jee-jsp 应用。

      service-jee-jaxrs]$ cd ../app-jee-jsp/
      app-jee-jsp]$ sed -i /\<executions\>/s/^/\<\!--/ pom.xml
      app-jee-jsp]$ sed -i '/\(<\/executions>\)/a\-->' pom.xml
      app-jee-jsp]$ mvn clean package -DskipTests
      [INFO] Scanning for projects...
      [INFO]
      [INFO] ------------------------------------------------------------------------
      [INFO] Building Keycloak Quickstart: app-jee-jsp 3.1.0.Final
      [INFO] ------------------------------------------------------------------------
      ...
      [INFO] Building war: /tmp/github/keycloak-quickstarts/app-jee-jsp/target/app-jsp.war
      [INFO] ------------------------------------------------------------------------
      [INFO] BUILD SUCCESS
      [INFO] ------------------------------------------------------------------------
      [INFO] Total time: 3.018 s
      [INFO] Finished at: 2017-06-26T12:22:25+02:00
      [INFO] Final Memory: 35M/310M
      [INFO] ------------------------------------------------------------------------
      重要

      app-jee-jsp Quickstart 要求您配置适配器,且适配器配置文件(keycloak.json)位于 quickstart 根目录下的 config/ 目录中,才能成功构建快速启动。但本例稍后会通过 EAP 6.4 / 7.1 为 OpenShift 镜像提供的所选环境变量来配置适配器,因此目前不需要指定 keycloak.json 适配器配置文件的形式。

  1. 在本地文件系统中准备目录结构。

    主二进制构建 目录的 deployment/ 子目录中的应用存档直接复制到 OpenShift 上构建的镜像的 标准部署目录中。对于要部署的应用,必须正确构建包含 Web 应用数据的目录层次结构。

    在本地文件系统和 部署/ 子目录中为二进制构建创建主目录。将 service-jee-jaxrsapp-jee-jsp Quickstart 的之前构建 WAR 存档复制到 deployments/ 子目录:

    app-jee-jsp]$ ls
    config  pom.xml  README.md  src  target
    app-jee-jsp]$ mkdir -p sso-eap7-bin-demo/deployments
    app-jee-jsp]$ cp target/app-jsp.war sso-eap7-bin-demo/deployments/
    app-jee-jsp]$ cp ../service-jee-jaxrs/target/service.war sso-eap7-bin-demo/deployments/
    app-jee-jsp]$ tree sso-eap7-bin-demo/
    sso-eap7-bin-demo/
    |__ deployments
        |__ app-jsp.war
        |__ service.war
    
    1 directory, 2 files
    注意

    标准部署目录的位置取决于用于部署应用的底层基础镜像。请参见以下表:

    Expand
    表 4.1. 部署目录的标准位置
    底层基础镜像的名称部署目录的标准位置

    用于 OpenShift 6.4 和 7.1 的 EAP

    $JBOSS_HOME/standalone/deployments

    用于 OpenShift 的 Java S2I

    /deployments

    用于 OpenShift 的 JWS

    $JWS_HOME/webapps

  2. 识别 EAP 6.4 / 7.1 镜像的镜像流。

    $ oc get is -n openshift | grep eap | cut -d ' ' -f 1
    jboss-eap64-openshift
    jboss-eap71-openshift
  1. 新建二进制构建,指定镜像流和应用程序名称。

    注意

    --image-stream=jboss-eap71-openshift 参数替换为以下 oc 命令中的 --image-stream=jboss-eap64-openshift,以在 OpenShift 镜像的 JBoss EAP 6.4 之上部署 JSP 应用程序。

    $ oc new-build --binary=true \
    --image-stream=jboss-eap71-openshift \
    --name=eap-app
    --> Found image 31895a4 (3 months old) in image stream "openshift/jboss-eap71-openshift" under tag "latest" for "jboss-eap71-openshift"
    
        JBoss EAP 7.4
        -------------
        Platform for building and running Jakarta EE applications on JBoss EAP 7.4
    
        Tags: builder, javaee, eap, eap7
    
        * A source build using binary input will be created
          * The resulting image will be pushed to image stream "eap-app:latest"
          * A binary build was created, use 'start-build --from-dir' to trigger a new build
    
    --> Creating resources with label build=eap-app ...
        imagestream "eap-app" created
        buildconfig "eap-app" created
    --> Success
  2. 启动二进制构建。指示 oc 可执行文件使用在上一步中创建的二进制构建 的主目录作为 包含 OpenShift 构建二进制输入的目录。在 app-jee-jsp 的工作目录中,发出以下命令。

    app-jee-jsp]$ oc start-build eap-app \
    --from-dir=./sso-eap7-bin-demo/ \
    --follow
    Uploading directory "sso-eap7-bin-demo" as binary input for the build ...
    build "eap-app-1" started
    Receiving source from STDIN as archive ...
    Copying all war artifacts from /home/jboss/source/. directory into /opt/eap/standalone/deployments for later deployment...
    Copying all ear artifacts from /home/jboss/source/. directory into /opt/eap/standalone/deployments for later deployment...
    Copying all rar artifacts from /home/jboss/source/. directory into /opt/eap/standalone/deployments for later deployment...
    Copying all jar artifacts from /home/jboss/source/. directory into /opt/eap/standalone/deployments for later deployment...
    Copying all war artifacts from /home/jboss/source/deployments directory into /opt/eap/standalone/deployments for later deployment...
    '/home/jboss/source/deployments/app-jsp.war' -> '/opt/eap/standalone/deployments/app-jsp.war'
    '/home/jboss/source/deployments/service.war' -> '/opt/eap/standalone/deployments/service.war'
    Copying all ear artifacts from /home/jboss/source/deployments directory into /opt/eap/standalone/deployments for later deployment...
    Copying all rar artifacts from /home/jboss/source/deployments directory into /opt/eap/standalone/deployments for later deployment...
    Copying all jar artifacts from /home/jboss/source/deployments directory into /opt/eap/standalone/deployments for later deployment...
    Pushing image 172.30.82.129:5000/eap-app-demo/eap-app:latest ...
    Pushed 6/7 layers, 86% complete
    Pushed 7/7 layers, 100% complete
    Push successful
  3. 基于构建创建新的 OpenShift 应用。

    $ oc new-app eap-app
    --> Found image 6b13d36 (2 minutes old) in image stream "eap-app-demo/eap-app" under tag "latest" for "eap-app"
    
        eap-app-demo/eap-app-1:aa2574d9
        -------------------------------
        Platform for building and running Jakarta EE applications on JBoss EAP 7.4
    
        Tags: builder, javaee, eap, eap7
    
        * This image will be deployed in deployment config "eap-app"
        * Ports 8080/tcp, 8443/tcp, 8778/tcp will be load balanced by service "eap-app"
          * Other containers can access this service through the hostname "eap-app"
    
    --> Creating resources ...
        deploymentconfig "eap-app" created
        service "eap-app" created
    --> Success
        Run 'oc status' to view your app.
  4. 在当前命名空间中停止 EAP 6.4 / 7.1 JSP 应用程序的所有容器。

    $ oc get dc -o name
    deploymentconfig/eap-app
    $ oc scale dc/eap-app --replicas=0
    deploymentconfig "eap-app" scaled
  5. 在部署前,进一步配置 EAP 6.4 / 7.1 JSP 应用程序。

    1. 针对 Red Hat Single Sign-On 服务器实例,配置应用程序。

      警告

      确保将以下 SSO_PUBLIC_KEY 变量的值替换为 demo 域的 RSA 公钥的实际内容,该变量的值已 复制

      $ oc set env dc/eap-app \
      -e HOSTNAME_HTTP="eap-app-eap-app-demo.openshift.example.com" \
      -e HOSTNAME_HTTPS="secure-eap-app-eap-app-demo.openshift.example.com" \
      -e SSO_DISABLE_SSL_CERTIFICATE_VALIDATION="true" \
      -e SSO_USERNAME="appuser" \
      -e SSO_PASSWORD="apppassword" \
      -e SSO_REALM="demo" \
      -e SSO_URL="https://secure-sso-sso-app-demo.openshift.example.com/auth" \
      -e SSO_PUBLIC_KEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkdhXyKx97oIoO6HwnV/MiX2EHO55Sn+ydsPzbjJevI5F31UvUco9uA8dGl6oM8HrnaWWv+i8PvmlaRMhhl6Xs68vJTEc6d0soP+6A+aExw0coNRp2PDwvzsXVWPvPQg3+iytStxu3Icndx+gC0ZYnxoRqL7rY7zKcQBScGEr78Nw6vZDwfe6d/PQ6W4xVErNytX9KyLFVAE1VvhXALyqEM/EqYGLmpjw5bMGVKRXnhmVo9E88CkFDH8E+aPiApb/gFul1GJOv+G8ySLoR1c8Y3L29F7C81odkVBp2yMm3RVFIGSPTjHqjO/nOtqYIfY4Wyw9mRIoY5SyW7044dZXRwIDAQAB" \
      -e SSO_SECRET="0bb8c399-2501-4fcd-a183-68ac5132868d"
      deploymentconfig "eap-app" updated
    2. 为应用配置 SSL 和 JGroups 密钥存储的详细信息。

      $ oc set env dc/eap-app \
      -e HTTPS_KEYSTORE_DIR="/etc/eap-secret-volume" \
      -e HTTPS_KEYSTORE="eapkeystore.jks" \
      -e HTTPS_PASSWORD="password" \
      -e JGROUPS_ENCRYPT_SECRET="eap-jgroup-secret" \
      -e JGROUPS_ENCRYPT_KEYSTORE_DIR="/etc/jgroups-encrypt-secret-volume" \
      -e JGROUPS_ENCRYPT_KEYSTORE="eapjgroups.jceks" \
      -e JGROUPS_ENCRYPT_PASSWORD="password"
      deploymentconfig "eap-app" updated
    3. 为之前创建的 SSL 和 JGroups 机密定义 OpenShift 卷。

      $ oc volume dc/eap-app --add \
      --name="eap-keystore-volume" \
      --type=secret \
      --secret-name="eap-ssl-secret" \
      --mount-path="/etc/eap-secret-volume"
      deploymentconfig "eap-app" updated
      $ oc volume dc/eap-app --add \
      --name="eap-jgroups-keystore-volume" \
      --type=secret \
      --secret-name="eap-jgroup-secret" \
      --mount-path="/etc/jgroups-encrypt-secret-volume"
      deploymentconfig "eap-app" updated
    4. 配置应用的部署配置,以在 默认的 OpenShift 服务帐户(默认设置)下运行应用容器集。

      $ oc patch dc/eap-app --type=json \
      -p '[{"op": "add", "path": "/spec/template/spec/serviceAccountName", "value": "default"}]'
      "eap-app" patched
  6. 使用修改后的部署配置部署 EAP 6.4 / 7.1 JSP 应用的容器。

    $ oc scale dc/eap-app --replicas=1
    deploymentconfig "eap-app" scaled
  7. 将服务作为路由公开。

    $ oc get svc -o name
    service/eap-app
    $ oc get route
    No resources found.
    $ oc expose svc/eap-app
    route "eap-app" exposed
    $ oc get route
    NAME      HOST/PORT                                    PATH      SERVICES   PORT       TERMINATION   WILDCARD
    eap-app   eap-app-eap-app-demo.openshift.example.com             eap-app    8080-tcp                 None

4.4.1.5. 访问应用程序

在浏览器中使用 URL http://eap-app-eap-app-demo.openshift.example.com/app-jsp 访问应用程序。您应该会在以下镜像中看到类似如下的输出:

Red Hat Single Sign-On Example JSP Application

流程

执行以下操作来测试应用程序:

  1. 单击 INVOKE PUBLIC 按钮,以访问不需要身份验证的 公共端点

    您应看到 Message: public 输出。

  2. 单击 LOGIN 按钮,以针对 演示 域将用户身份验证重定向到红帽单点登录服务器实例。

    指定之前配置的 Red Hat Single Sign-On 用户的用户名和密码(appuser / apppassword)。点登录。查看应用程序变化,具体如下镜像:

    sso app jee jsp logged in

  3. 单击 INVOKE SECURED 按钮来访问安全 端点

    您应该看到 Message: secure output

  4. INVOKE ADMIN 按钮访问 admin 端点。

    您应该看到 403 Forbidden 输出。

    注意

    admin 端点需要 admin Red Hat Single Sign-On 角色来调用属性。禁止 appuser 的访问,因为它们只有 user 角色特权,这允许他们访问 secured 端点。

流程

执行以下步骤将 appuser 添加到 admin Red Hat Single Sign-On 角色:

  1. 访问红帽单点登录服务器的管理控制台。

    https://secure-sso-sso-app-demo.openshift.example.com/auth/admin.

    使用 Red Hat Single Sign-On 管理员用户 的凭据

  2. 单击 Manage sidebar 中的 Users,以查看 demo 域的用户信息。
  3. View all users 按钮。
  4. appuser 的 ID 链接,或者点 Actions 列中的 Edit 按钮。
  5. Role Mappings 选项卡。
  6. Realm Roles 行中,选择 Available Roles 列表中的 admin 条目。
  7. Add selected > 按钮将 admin 角色添加到用户。
  8. 返回到 EAP 6.4 / 7.1 JSP 服务应用程序。

    http://eap-app-eap-app-demo.openshift.example.com/app-jsp.

  9. 单击 LOGOUT 按钮,以重新加载 appuser 的角色映射。
  10. 再次单击 LOGIN 按钮和 provider appuser 凭据。
  11. 再次单击 INVOKE ADMIN 按钮。

    您应该看到 Message: admin output already。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部