4.4. 从 maven 二进制文件创建 OpenShift 应用程序,并使用 Red Hat Single Sign-On 对其进行保护
要在 OpenShift 上部署现有应用,您可以使用二进制源功能。
以下示例使用 app-jee-jsp 和 service-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
4.4.1.1. 为 EAP 6.4 / 7.1 JSP 应用程序创建红帽单点登录、角色和用户 复制链接链接已复制到粘贴板!
EAP 6.4 / 7.1 JSP 服务应用需要专门的红帽单点登录域、用户名和密码才能使用红帽单点登录进行身份验证。在为 OpenShift 镜像部署了 Red Hat Single Sign-On 后执行以下步骤:
创建 Red Hat Single Sign-On Realm
登录红帽单点登录服务器的管理控制台。
https://secure-sso-sso-app-demo.openshift.example.com/auth/admin
- 将光标悬停在域命名空间(默认为 主栏的顶部),然后单击 Add Realm。
-
输入 realm 名称(本示例使用
demo)并点 Create。
复制公钥
在新创建的 演示域中,单击 Keys 选项卡,然后选择 Active 选项卡,然后复制生成的 RSA 的公钥。
默认情况下,Red Hat Single Sign-On for OpenShift 镜像版本 7.6.11 会生成多个密钥,如 HS256、RS256 或 AES。要复制 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 应用用户,以验证对用户应用的访问权限。
单击 Configure 边栏中的 Roles,以列出此域的角色。
注意这是一个新域,因此只有默认值(
offline_access和uma_authorization)角色。- 点 Add Role。
-
输入角色名称(
用户),然后单击保存。
对 admin 角色重复这些步骤。
创建 Red Hat Single Sign-On Realm 管理用户
- 单击 Manage sidebar 中的 Users,以查看域的用户信息。
- 点 Add User。
-
输入一个有效的 Username (本例使用用户
appuser)并点 Save。 编辑用户配置:
-
单击用户空间中的 Credentials 选项卡,然后为用户输入一个密码(本例使用密码
apppassword)。 - 确保将 Temporary Password 选项设为 Off,以便它不会稍后提示输入密码,然后单击 Reset Password 来设置用户密码。弹出窗口将提示您确认。
-
单击用户空间中的 Credentials 选项卡,然后为用户输入一个密码(本例使用密码
4.4.1.2. 将 user 角色分配给 realm 管理用户 复制链接链接已复制到粘贴板!
执行以下步骤将之前创建的 appuser 用户与 Red Hat Single Sign-On 角色关联:
-
单击 Role Mappings,以列出 realm 和 client 角色配置。在 Available Roles 中,选择之前创建的
用户角色,然后点击 Add selected>。 点 Client Roles,从列表中选择 realm-management 条目,在 Available Roles 列表中选择每个记录。
注意您可以通过保留 Ctrl 键并同时点击第一个
模拟条目来选择多个项目。虽然保留 Ctrl 键和鼠标左键,但按鼠标右键移动至view-clients条目的结尾,并确保每个记录已被选中。- 点 Add selected > 将角色分配给客户端。
流程
为 EAP 6.4 / 7.1 JSP 应用创建一个新项目。
$ oc new-project eap-app-demo将
view角色添加到default服务帐户。这可让服务帐户查看eap-app-demo命名空间中的所有资源,这是管理集群所必需的。$ oc policy add-role-to-user view system:serviceaccount:$(oc project -q):defaultEAP 模板需要 SSL 密钥存储和 JGroups 密钥存储。本例使用
keytool(Java Development Kit 中包含的软件包)为这些密钥存储生成自签名证书。为 SSL 密钥存储生成安全密钥(本例使用
password作为密钥存储的密码)。$ keytool -genkeypair \ -dname "CN=secure-eap-app-eap-app-demo.openshift.example.com" \ -alias https \ -storetype JKS \ -keystore eapkeystore.jks为 JGroups 密钥存储生成安全密钥(本例使用
password作为密钥存储的密码)。$ keytool -genseckey \ -alias jgroups \ -storetype JCEKS \ -keystore eapjgroups.jceks使用 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将 EAP 应用机密添加到
default服务帐户。$ oc secrets link default eap-ssl-secret eap-jgroup-secret
4.4.1.4. 部署 EAP 6.4 / 7.1 JSP 应用程序的二进制构建 复制链接链接已复制到粘贴板!
流程
克隆源代码。
$ git clone https://github.com/keycloak/keycloak-quickstarts.git同时构建 service-jee-jaxrs 和 app-jee-jsp 应用。
构建
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] ------------------------------------------------------------------------注释掉
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.xmlapp-jee-jsp]$ sed -i '/\(<\/executions>\)/a\-->' pom.xmlapp-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适配器配置文件的形式。
在本地文件系统中准备目录结构。
主二进制构建 目录的 deployment/ 子目录中的应用存档直接复制到 OpenShift 上构建的镜像的 标准部署目录中。对于要部署的应用,必须正确构建包含 Web 应用数据的目录层次结构。
在本地文件系统和 部署/ 子目录中为二进制构建创建主目录。将 service-jee-jaxrs 和 app-jee-jsp Quickstart 的之前构建 WAR 存档复制到 deployments/ 子目录:
app-jee-jsp]$ ls config pom.xml README.md src targetapp-jee-jsp]$ mkdir -p sso-eap7-bin-demo/deploymentsapp-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
识别 EAP 6.4 / 7.1 镜像的镜像流。
$ oc get is -n openshift | grep eap | cut -d ' ' -f 1 jboss-eap64-openshift jboss-eap71-openshift
新建二进制构建,指定镜像流和应用程序名称。
注意将
--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启动二进制构建。指示
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基于构建创建新的 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.在当前命名空间中停止 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在部署前,进一步配置 EAP 6.4 / 7.1 JSP 应用程序。
针对 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为应用配置 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为之前创建的 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配置应用的部署配置,以在
默认的OpenShift 服务帐户(默认设置)下运行应用容器集。$ oc patch dc/eap-app --type=json \ -p '[{"op": "add", "path": "/spec/template/spec/serviceAccountName", "value": "default"}]' "eap-app" patched
使用修改后的部署配置部署 EAP 6.4 / 7.1 JSP 应用的容器。
$ oc scale dc/eap-app --replicas=1 deploymentconfig "eap-app" scaled将服务作为路由公开。
$ 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 访问应用程序。您应该会在以下镜像中看到类似如下的输出:
流程
执行以下操作来测试应用程序:
单击 INVOKE PUBLIC 按钮,以访问不需要身份验证的
公共端点。您应看到 Message: public 输出。
单击 LOGIN 按钮,以针对
演示域将用户身份验证重定向到红帽单点登录服务器实例。指定之前配置的 Red Hat Single Sign-On 用户的用户名和密码(
appuser/apppassword)。点登录。查看应用程序变化,具体如下镜像:
单击 INVOKE SECURED 按钮来访问安全
端点。您应该看到 Message: secure output。
点 INVOKE ADMIN 按钮访问
admin端点。您应该看到 403 Forbidden 输出。
注意admin端点需要adminRed Hat Single Sign-On 角色来调用属性。禁止appuser的访问,因为它们只有user角色特权,这允许他们访问secured端点。
流程
执行以下步骤将 appuser 添加到 admin Red Hat Single Sign-On 角色:
访问红帽单点登录服务器的管理控制台。
https://secure-sso-sso-app-demo.openshift.example.com/auth/admin.
-
单击 Manage sidebar 中的 Users,以查看
demo域的用户信息。 - 点 View all users 按钮。
- 点 appuser 的 ID 链接,或者点 Actions 列中的 Edit 按钮。
- 点 Role Mappings 选项卡。
-
在 Realm Roles 行中,选择 Available Roles 列表中的
admin条目。 -
点 Add selected > 按钮将
admin角色添加到用户。 返回到 EAP 6.4 / 7.1 JSP 服务应用程序。
http://eap-app-eap-app-demo.openshift.example.com/app-jsp.
-
单击 LOGOUT 按钮,以重新加载
appuser的角色映射。 -
再次单击 LOGIN 按钮和 provider
appuser凭据。 再次单击 INVOKE ADMIN 按钮。
您应该看到 Message: admin output already。