9.3. 使用 OpenID Connect 与红帽单点登录保护应用程序
您可以使用 OpenID Connect (OIDC)将身份验证委派给外部 OpenID 供应商。elytron-oidc-client 子系统在 JBoss EAP 中提供原生 OIDC 客户端,以与外部 OpenID 供应商连接。
要使用 Red Hat Single Sign-On 创建使用 OpenID Connect 保护的应用程序,请按照以下步骤执行:
9.3.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-example/secured/*
9.3.2. 配置 Maven 项目以创建安全应用程序 复制链接链接已复制到粘贴板!
创建一个具有所需依赖项的 Maven 项目,以及用于创建安全应用程序的目录结构。
先决条件
- 您已安装了 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-example \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=false进入到应用程序根目录:
语法
$ cd <name-of-your-application>Example
$ cd simple-oidc-example更新生成的
pom.xml文件,如下所示:设置以下属性:
<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>设置以下依赖项:
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0.redhat-1</version> <scope>provided</scope> </dependency> </dependencies>将以下构建配置设置为使用
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>
验证
在应用程序根目录中,输入以下命令:
$ mvn install您会看到类似如下的输出:
[INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.440 s [INFO] Finished at: 2021-12-27T14:45:12+05:30 [INFO] ------------------------------------------------------------------------
现在,您可以创建安全应用程序。
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文件。
该流程中的 < ;application_root > 表示 pom.xml 文件目录。pom.xml 文件包含应用的 Maven 配置。
先决条件
- 您已创建了一个 Maven 项目。如需更多信息,请参阅配置 Maven 项目以创建安全应用程序 。
- 您已将 Red Hat Single Sign-On 配置为 OpenID 供应商。如需更多信息,请参阅配置 Red Hat Single Sign-On 作为 OpenID 供应商。
-
您已启用了
elytron-oidc-client子系统。如需更多信息,请参阅启用 elytron-oidc-client 子系统
流程
创建一个用于存储 Java 文件的目录。
语法
$ mkdir -p <application_root>/src/main/java/com/example/oidcExample
$ mkdir -p simple-oidc-example/src/main/java/com/example/oidc前往新目录。
语法
$ cd <application_root>/src/main/java/com/example/oidcExample
$ cd simple-oidc-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 命令:
/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)
在应用程序根目录中,使用以下命令编译应用程序:
$ mvn package部署应用。
$ mvn wildfly:deploy
验证
-
在一个浏览器中,导航到
http://localhost:8080/simple-oidc-example/secured。 使用您的凭证登录。例如:
username: jane_doe password: janedoep@$$您将获得以下输出:
Secured Servlet Current Principal '5cb0c4ca-0477-44c3-bdef-04db04d7e39d'现在,您可以使用您在 Red Hat Single Sign-On 中配置的凭证作为 OpenID 供应商登录到应用程序。
9.3.4. 根据用户角色限制对应用程序的访问 复制链接链接已复制到粘贴板!
您可以根据用户角色限制对应用程序的所有或部分的访问。例如,您可以让具有"public"角色的用户能够访问您应用程序的部分不敏感,并授予用户对那些部分的"admin"角色访问权限。
先决条件
- 您已使用 OpenID Connect 保护应用程序。如需更多信息,请参阅创建使用 OpenID Connect 的安全应用程序。
流程
使用以下文本更新部署描述符
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部署应用。
$ mvn wildfly:deploy
验证
-
在一个浏览器中,导航到
http://localhost:8080/simple-oidc-example/secured。 使用您的凭证登录。例如:
username: jane_doe password: janedoep@$$您将获得以下输出:
Forbidden由于您尚未将所需的角色分配给用户 "jane_doe," jane_doe 无法登录到您的应用程序。只有具有所需角色的用户才能登录。
要为用户分配所需的角色,请参阅 在 Red Hat Single Sign-On 中创建和分配角色。
9.3.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'具有所需角色的用户可以登录到您的应用程序。