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


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

4.4.1. 使用 Red Hat Single Sign-On 部署 Binary Build of EAP 6.4 / 7.1 JSP 服务 Invocation Application 并保护它

以下示例使用 app-jee-jspservice-jee-jaxrs Quickstart 部署 EAP 6.4 / 7.1 / 7.1 / 7.1 JSP 服务应用,此应用使用红帽单点登录进行身份验证。

前提条件

  • OpenShift 镜像的 Red Hat Single Sign-On 之前使用以下模板之一进行部署:
  • sso75-postgresql
  • sso75-postgresql-persistent
  • sso75-x509-postgresql-persistent

4.4.1.1. 为 EAP 6.4 / 7.1 / 7.1 JSP 应用创建 Red Hat Single Sign-On Realm、role 和 User

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

创建 Red Hat Single Sign-On Realm

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

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

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

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

复制公钥

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

注意

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

稍后需要有关公钥的信息,以便部署启用了 Red Hat Single Sign-On 的 EAP 6.4 / 7.1 JSP 应用。???

创建红帽单点登录角色

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

  • 公共 - 不需要身份验证。
  • 安全 - 可以被具有用户角色的用户调用。
  • admin - 可由具有 admin 角色的用户调用。

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

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

    注意

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

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

admin 角色重复上述步骤。

创建 Red Hat Single Sign-On Realm Management 用户

  1. 单击 Manage 栏中的 Users,以查看该域的用户信息。
  2. Add User。
  3. 输入有效 用户名 (本例使用 user appuser),然后单击 Save
  4. 编辑用户配置:

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

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

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

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

    注意

    您可以通过按住 Ctrl 键并同时点击第一个 模拟 条目来一次性选择多个项目。在保持 Ctrl 键和左键键时,请将列表的末尾移至 view-clients 条目,并确保选中每个记录。

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

4.4.1.3. 准备红帽单点登录身份验证,以进行 EAP 6.4 / 7.1 JSP 应用的 OpenShift 部署

流程

  1. 为 EAP 6.4 / 7.1 / 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 密钥存储生成安全密钥(本示例将 密码 用作密钥存储的密码)。

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

      $ 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

4.4.1.4. 部署 EAP 6.4 / 7.1 JSP 应用的二进制构建

流程

  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 快速入门要求您配置适配器配置文件,并且适配器配置文件(keycloak.json)位于快速启动的 config/ 目录中,以成功构建快速入门。但本例稍后通过为 EAP 6.4 / 7.1 用于 OpenShift 映像的所选环境变量配置适配器,因此此时不需要指定 keycloak.json 适配器配置文件的形式。

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

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

    在本地文件系统和其中的 deployments/ 子目录中为二进制构建创建主目录。将之前构建的 WAR 存档(由 service-jee-jaxrsapp-jee-jsp Quickstart)复制到 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
    注意

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

    表 4.1. Deployments 目录的标准位置
    Base Image (s)的底层名称Deployments 目录的标准位置

    EAP for OpenShift 6.4 and 7.1

    $JBOSS_HOME/standalone/deployments

    用于 OpenShift 的 Java S2I

    /deployments

    JWS for OpenShift

    $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,以在 JBoss EAP 6.4 的 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 / 7.1 应用的容器。

    $ 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 应用的容器。

    $ 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 按钮,以根据 demo 域重定向到 Red Hat Single Sign-On 服务器实例。

    指定之前配置的 Red Hat Single Sign-On 用户的用户名和密码(appuser / apppassword)。点登录。以下镜像中详述了应用程序更改:

    sso app jee jsp logged in

  3. 单击 INVOKE SECURED 按钮,以访问 安全 端点。

    您应看到 Message: secure 输出

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

    您应该看到 403 Forbidden 输出。

    注意

    admin 端点要求具有 admin Red Hat Single Sign-On 角色的用户正确调用。对 appuser 的访问是禁止的,因为它们只有 用户角色 特权,允许他们 访问受保护的 端点。

流程

执行以下步骤将 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 栏中的 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 输出。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.