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 保护的应用程序,请按照以下步骤执行:
9.4.1. 将 Red Hat Single Sign-On 配置为 OpenID 供应商 复制链接链接已复制到粘贴板!
Red Hat Single Sign-On 是一个身份和访问管理供应商,用于通过单点登录(SSO)保护 Web 应用程序。它支持 OpenID Connect (OAuth 2.0 的扩展)。
先决条件
- 已安装 Red Hat Single Sign-On 服务器。如需更多信息,请参阅 Red Hat Single Sign-On 入门指南 中的安装 Red Hat Single Sign-On 服务器。
- 您已在 Red Hat Single Sign-On 服务器实例中创建用户。如需更多信息,请参阅 Red Hat Single Sign-On 入门指南中的创建用户。https://access.redhat.com/documentation/zh-cn/red_hat_single_sign-on/7.5/html-single/getting_started_guide/#create-user_
流程
在 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-
登录到位于
http://localhost:<port>/auth/ 的管理控制台。例如:http://localhost:8180/auth/。 - 要创建域,请在管理门户中,将鼠标悬停在 Master 上,然后单击 Add realm。
-
输入 realm 的名称。例如:
example_realm。确保 Enabled 为 ON,再单击 Create。 - 点 Users,然后点 Add user 将用户添加到域中。
-
输入用户名。例如,
jane_doe。确保 User Enabled 为 ON,然后单击 Save。 - 点 Credentials 为用户添加密码。
-
设置用户的密码。例如,
janedoep@$$。将 Temporary 切换到 OFF,然后单击 Set Password。在确认提示中,单击 Set password。 - 点 Clients,然后点 Create 来配置客户端连接。
-
输入客户端 ID。例如,
my_jbeap。确保将 Client Protocol 设置为openid-connect,然后单击 Save。 点 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- 点 Clients,点 my_jbeap 旁边的 Edit 来编辑客户端设置。
在 Valid Redirect URI 中,输入身份验证成功后页面应重定向的 URL。
在本例中,将此值设置为
http://localhost:8080/simple-oidc-layer-example/secured/*
9.4.2. 为可引导 jar OIDC 应用程序配置 Maven 项目 复制链接链接已复制到粘贴板!
创建一个具有所需依赖项的 Maven 项目,以及用于创建使用 OpenID Connect 的可引导 jar 应用程序的目录结构。elytron-oidc-client galleon 层提供了一个原生 OpenID Connect (OIDC)客户端来与 OpenID 供应商连接。
先决条件
- 您已安装了 Maven。如需更多信息,请参阅 下载 Apache Maven。
- 您已为最新版本配置了 Maven 存储库。如需更多信息,请参阅 Maven 和 JBoss EAP microprofile Maven 存储库。
流程
使用
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=falseExample
$ mvn archetype:generate \ -DgroupId=com.example.oidc \ -DartifactId=simple-oidc-layer-example \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=false导航到应用程序根目录。
语法
$ cd <name-of-your-application>Example
$ cd simple-oidc-layer-example更新生成的
pom.xml文件,如下所示:设置以下软件仓库:
<repositories> <repository> <id>jboss</id> <url>https://maven.repository.redhat.com/ga</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>设置以下插件存储库:
<pluginRepositories> <pluginRepository> <id>jboss</id> <url>https://maven.repository.redhat.com/ga</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories>设置以下属性:
<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>设置以下依赖项:
<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>在
pom.xml文件的 <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 位于 URLhttp://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。
在
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 应用程序
9.4.3. 创建使用 OpenID Connect 的可引导 jar 应用程序 复制链接链接已复制到粘贴板!
以下示例演示了创建一个显示已登录用户的 Principal 的 servlet。对于现有应用程序,只需要与更新部署配置相关的步骤。
在本例中,Principal 的值来自 OpenID 提供程序的 ID 令牌。默认情况下,Principal 是令牌中的 "sub" 声明的值。您可以在以下之一中指定 ID 令牌中的声明值作为 Principal :
-
elytron-oidc-client子系统属性principal-attribute。 -
oidc.json文件。
该流程中的 < ;application_root > 表示 pom.xml 文件目录。pom.xml 文件包含应用的 Maven 配置。
先决条件
- 您已创建了一个 Maven 项目。如需更多信息,请参阅配置 Maven 项目以创建安全应用程序 。
- 您已将 Red Hat Single Sign-On 配置为 OpenID 供应商。如需更多信息,请参阅配置 Red Hat Single Sign-On 作为 OpenID 供应商。
流程
创建一个用于存储 Java 文件的目录。
语法
$ mkdir -p <application_root>/src/main/java/com/example/oidcExample
$ mkdir -p simple-oidc-layer-example/src/main/java/com/example/oidc前往新目录。
语法
$ cd <application_root>/src/main/java/com/example/oidcExample
$ cd simple-oidc-layer-example/src/main/java/com/example/oidc使用以下内容创建 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>"); } } }在应用的
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>要使用 OpenID Connect 保护应用,可以更新部署配置或配置
elytron-oidc-client子系统。注意如果您在部署配置和
elytron-oidc-client子系统中配置 OpenID Connect,则elytron-oidc-client子系统secure-deployment属性中的配置优先于应用部署描述符中的配置。更新部署配置:
在
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 }使用以下文本更新部署描述符
web.xml文件,以声明此应用程序使用 OIDC:<login-config> <auth-method>OIDC</auth-method> </login-config>
配置
elytron-oidc-client子系统:创建一个目录,将 CLI 脚本存储在应用程序根目录中:
语法
$ mkdir <application_root>/<cli_script_directory>Example
$ mkdir simple-oidc-layer-example/scripts/您可以在 Maven 能够访问应用程序根目录的任意位置创建该目录。
创建包含以下内容的 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子系统中保护的部署。在项目
pom.xml文件中,将以下配置提取添加到现有插件 <configuration>元素中:<cli-sessions> <cli-session> <script-files> <script>scripts/configure-oidc.cli</script> </script-files> </cli-session> </cli-sessions>
在应用程序根目录中,使用以下命令编译应用程序:
$ mvn package使用以下命令部署可引导 jar 应用程序:
语法
$ java -jar <application_root>/target/simple-oidc-layer-example-bootable.jarExample
$ java -jar simple-oidc-layer-example/target/simple-oidc-layer-example-bootable.jar这将启动 JBoss EAP 并部署应用程序。
验证
-
在一个浏览器中,导航到
http://localhost:8080/simple-oidc-layer-example/secured。 使用您的凭证登录。例如:
username: jane_doe password: janedoep@$$您将获得以下输出:
Secured Servlet Current Principal '5cb0c4ca-0477-44c3-bdef-04db04d7e39d'现在,您可以使用您在 Red Hat Single Sign-On 中配置的凭证作为 OpenID 供应商登录到应用程序。
9.4.4. 根据可引导 jar OIDC 应用程序中的用户角色限制访问 复制链接链接已复制到粘贴板!
您可以根据用户角色限制对应用程序的所有或部分的访问。例如,您可以让具有"public"角色的用户能够访问您应用程序的部分不敏感,并授予用户对那些部分的"admin"角色访问权限。
先决条件
- 您已使用 OpenID Connect 保护应用程序。如需更多信息,请参阅 创建使用 OpenID Connect 的可引导 jar 应用程序。
流程
使用以下文本更新部署描述符
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角色的用户访问您的应用。
在应用程序根目录中,使用以下命令重新编译应用程序:
$ mvn package部署应用。
$ java -jar simple-oidc-layer-example/target/simple-oidc-layer-example-bootable.jar这将启动 JBoss EAP 并部署应用程序。
验证
-
在浏览器中,导航到
\localhost:8080/simple-oidc-layer-example/secured。 使用您的凭证登录。例如:
username: jane_doe password: janedoep@$$您将获得以下输出:
Forbidden由于您尚未将所需的角色分配给用户 "jane_doe," jane_doe 无法登录到您的应用程序。只有具有所需角色的用户才能登录。
要为用户分配所需的角色,请参阅 在 Red Hat Single Sign-On 中创建和分配角色。
9.4.5. 在 Red Hat Single Sign-On 中创建并分配用户角色 复制链接链接已复制到粘贴板!
Red Hat Single Sign-On 是一个身份和访问管理供应商,用于通过单点登录(SSO)保护您的 Web 应用程序。您可以在 Red Hat Single Sign-On 中定义用户并分配角色。
先决条件
- 您已配置了 Red Hat Single Sign-On。如需更多信息,请参阅配置 Red Hat Single Sign-On 作为 OpenID 供应商。
流程
-
登录到位于
http://localhost:<port>/auth/的 admin 控制台。例如:http://localhost:8180/auth/。 - 单击用于与 JBoss EAP 连接的域。例如: example_realm。
-
单击 Clients,然后单击您为 JBoss EAP 配置的
client-name。例如,my_jbeap。 - 单击 Roles,然后单击 Add Role。
- 输入角色名称,如 example_role,然后单击 Save。这是您在 JBoss EAP 中配置用于授权的角色名称。
- 单击 Users,然后查看所有用户。
- 点 ID 来分配您创建的角色。例如,单击 jane_doe 的 ID。
-
点 Role Mappings。在 Client Roles 字段中,选择您为 JBoss EAP 配置的
client-name。例如,my_jbeap。 - 在 Available Roles 中,选择要分配的角色。例如,example_role。单击 Add selected。
验证
- 在浏览器中,导航到应用 URL。
使用您的凭证登录。例如:
username: jane_doe password: janedoep@$$您将获得以下输出:
Secured Servlet Current Principal '5cb0c4ca-0477-44c3-bdef-04db04d7e39d'具有所需角色的用户可以登录到您的应用程序。