第 2 章 使用 OpenID Connect 保护应用程序和服务
本节论述了如何使用 Red Hat Single Sign-On 适配器或通用 OpenID Connect 重新授权库在 OpenID Connect 中保护应用程序和服务。
2.1. Java 适配器 复制链接链接已复制到粘贴板!
Red Hat Single Sign-On 附带了一系列不同的 Java 应用程序适配器。选择正确的适配器取决于目标平台。
所有 Java 适配器共享一组在 Java 适配器 配置章节中描述的通用配置选项。
2.1.1. Java 适配器配置 复制链接链接已复制到粘贴板!
Red Hat Single Sign-On 支持的每个 Java 适配器都可通过简单的 JSON 文件进行配置。它可能类似如下:
{
"realm" : "demo",
"resource" : "customer-portal",
"realm-public-key" : "MIGfMA0GCSqGSIb3D...31LwIDAQAB",
"auth-server-url" : "https://localhost:8443/auth",
"ssl-required" : "external",
"use-resource-role-mappings" : false,
"enable-cors" : true,
"cors-max-age" : 1000,
"cors-allowed-methods" : "POST, PUT, DELETE, GET",
"cors-exposed-headers" : "WWW-Authenticate, My-custom-exposed-Header",
"bearer-only" : false,
"enable-basic-auth" : false,
"expose-token" : true,
"verify-token-audience" : true,
"credentials" : {
"secret" : "234234-234234-234234"
},
"connection-pool-size" : 20,
"socket-timeout-millis": 5000,
"connection-timeout-millis": 6000,
"connection-ttl-millis": 500,
"disable-trust-manager": false,
"allow-any-hostname" : false,
"truststore" : "path/to/truststore.jks",
"truststore-password" : "geheim",
"client-keystore" : "path/to/client-keystore.jks",
"client-keystore-password" : "geheim",
"client-key-password" : "geheim",
"token-minimum-time-to-live" : 10,
"min-time-between-jwks-requests" : 10,
"public-key-cache-ttl": 86400,
"redirect-rewrite-rules" : {
"^/wsmaster/api/(.*)$" : "/api/$1"
}
}
您可以使用 ${…} 213ure 进行系统属性替换。例如,${jboss.server.config.dir} 替换为 /path/to/Red Hat Single Sign-On。也支持通过 env 前缀替换环境变量,如 ${env.MY_ENVIRONMENT_VARIABLE}。
初始配置文件可以从管理控制台获取。这可以通过打开 admin 控制台来完成,从菜单中选择 Clients,再单击对应的客户端。打开客户端的页面后,点 Installation 选项卡并选择 Keycloak OIDC JSON。
下面是每个配置选项的描述:
- realm
- realm 的名称。这是 REQUIRED。
- resource
- 应用程序的 client-id。每个应用程序都有一个客户端 ID,用于识别应用程序。这是 REQUIRED。
- realm-public-key
- realm 公钥的 PEM 格式。您可以从 Admin Console 获取它。这是 OPTIONAL,我们不推荐设置它。如果没有设置,适配器将从 Red Hat Single Sign-On 下载它,并将在需要时始终重新下载它(例如 Red Hat Single Sign-On 将其密钥轮转)。但是,如果设置了 realm-public-key,则适配器永远不会从 Red Hat Single Sign-On 下载新密钥,因此当 Red Hat Single Sign-On 将其密钥轮转时,适配器将中断。
- auth-server-url
-
Red Hat Single Sign-On 服务器的基本 URL。所有其他 Red Hat Single Sign-On 页面和 REST 服务端点都来自于此目的。它通常是
https://host:port/auth的格式。这是 REQUIRED。 - SSL-required
-
确保与 Red Hat Single Sign-On 服务器的所有通信都是通过 HTTPS。在生产环境中,这应设置为
所有。这是 选项。默认值为 external,表示外部请求默认为 HTTPS。有效值为 'all'、'external' 和 'none"。 - confidential-port
- 红帽单点登录服务器用于通过 SSL/TLS 进行安全连接的机密端口。这是 选项。默认值为 8443。
- use-resource-role-mappings
- 如果设置为 true,则适配器会在令牌中查找用户的应用程序级别角色映射。如果为 false,它将查看用户角色映射的域级别。这是 选项。默认值为 false。
- public-client
- 如果设置为 true,则适配器不会将客户端的凭证发送到 Red Hat Single Sign-On。这是 选项。默认值为 false。
- enable-cors
- 这可让 CORS 支持。它将处理 CORS preflight 请求。它还将查看访问令牌来确定有效来源。这是 选项。默认值为 false。
- cors-max-age
-
如果启用了 CORS,这将设置
Access-Control-Max-Age标头的值。这是 选项。如果没有设置,则 CORS 响应中不会返回此标头。 - cors-allowed-methods
-
如果启用了 CORS,这将设置
Access-Control-Allow-Methods标头的值。这应该是一个用逗号分开的字符串。这是 选项。如果没有设置,则 CORS 响应中不会返回此标头。 - cors-allowed-headers
-
如果启用了 CORS,这将设置
Access-Control-Allow-Headers标头的值。这应该是一个用逗号分开的字符串。这是 选项。如果没有设置,则 CORS 响应中不会返回此标头。 - cors-exposed-headers
-
如果启用了 CORS,这将设置
Access-Control-Expose-Headers标头的值。这应该是一个用逗号分开的字符串。这是 选项。如果没有设置,则 CORS 响应中不会返回此标头。 - bearer-only
- 对于服务,这应设置为 true。如果启用了适配器,则不会尝试验证用户,而是仅验证 bearer 令牌。这是 选项。默认值为 false。
- autodetect-bearer-only
-
如果您的应用程序同时为 Web 应用程序和 Web 服务(如 SOAP 或 REST)提供,则此项应设为 true。它允许您将 Web 应用的未经身份验证的用户重定向到 Red Hat Single Sign-On 登录页面,但向未经身份验证的 SOAP 或 REST 客户端发送 HTTP
401状态代码,而不是将它们了解到登录页面。Red Hat Single Sign-On auto-detects SOAP 或 REST 客户端基于X-Requested-With、SOAPAction或Accept等典型标头。默认值为 false。 - enable-basic-auth
- 这告知适配器也支持基本身份验证。如果启用了这个选项,则必须提供 secret。这是 选项。默认值为 false。
- expose-token
-
如果为
true,则经过身份验证的用户客户端(通过 JavaScript HTTP 调用)可以通过 URLroot/k_query_bearer_token获取签名的访问令牌。这是 选项。默认值为 false。 - credentials
- 指定应用程序的凭证。这是一个对象表示法,其中键是凭证类型,值是凭证类型的值。目前支持密码和 jwt。这只适用于 带有 "Confidential"访问类型的客户端。
- connection-pool-size
-
此配置选项定义了与 Red Hat Single Sign-On 服务器的连接数量。这是 选项。默认值为
20。 - socket-timeout-millis
-
以毫秒为单位建立连接后等待数据的套接字超时。两个数据数据包间不活跃的时间的最大时间。超时值为零被解释为无限超时。负值解析为未定义(如果适用,则默认为系统)。默认值为
-1。这是 选项。 - connection-timeout-millis
-
以毫秒为单位建立与远程主机建立连接的超时时间。超时值为零被解释为无限超时。负值解析为未定义(如果适用,则默认为系统)。默认值为
-1。这是 选项。 - connection-ttl-millis
-
以毫秒为单位的客户端连接时间。值小于或等于零。默认值为
-1。这是 选项。 - disable-trust-manager
-
如果 Red Hat Single Sign-On 服务器需要 HTTPS,且这个配置选项被设置为
true,则不必指定信任存储。此设置仅应在开发期间使用,且不应 在生产环境中使用,因为它将禁用 SSL 证书的验证。这是 选项。默认值为false。 - allow-any-hostname
-
如果 Red Hat Single Sign-On 服务器需要 HTTPS,且这个配置选项被设置为
true,Red Hat Single Sign-On 服务器的证书通过 truststore 验证,但没有进行主机名验证。此设置仅应在开发期间使用,且不应 在生产环境中使用,因为它将禁用 SSL 证书的验证。在测试环境中,这种设置 可能很有用。默认值为false。 - proxy-url
- 如果使用 HTTP 代理的 URL。
- truststore
-
该值是 truststore 文件的文件路径。如果您为带有
classpath 的路径添加前缀:,则信任存储将从部署的类路径中获取。用于向 Red Hat Single Sign-On 服务器的外向 HTTPS 通信。进行 HTTPS 请求的客户端需要一种方式来验证所讨论的服务器主机。这是信任者的作用。密钥存储包含一个或多个可信主机证书或证书颁发机构。您可以通过提取红帽单点登录服务器 SSL 密钥存储的公共证书来创建此信任存储。这是 REQUIRED,除非ssl-required为none或disable-trust-manager为true。 - truststore-password
-
truststore 的密码。如果设置了
truststore,则 REQUIRED 为 REQUIRED,并且信任存储需要密码。 - client-keystore
- 这是密钥存储文件的文件路径。此密钥存储包含在适配器向 Red Hat Single Sign-On 服务器发出 HTTPS 请求时的双向 SSL 客户端证书。这是 选项。
- client-keystore-password
-
客户端密钥存储的密码。如果设置了
client-keystore,则这是 REQUIRED。 - client-key-password
-
客户端密钥的密码。如果设置了
client-keystore,则这是 REQUIRED。 - always-refresh-token
- 如果为 true,适配器会在每个请求中刷新令牌。警告 - 启用时,每次请求您的应用程序都会请求 Red Hat Single Sign-On。
- register-node-at-startup
- 如果为 true,则适配器将为 Red Hat Single Sign-On 发送注册请求。默认设置为 false,且仅在应用程序集群时才有用。详情请参阅 应用程序集群
- register-node-period
- 在 Red Hat Single Sign-On 中重新注册适配器的周期。当应用程序被集群时,非常有用。详情请参阅 应用程序集群
- token-store
- 可能的值有 session 和 cookie。默认为 session,这意味着适配器将帐户信息存储在 HTTP Session 中。另一种 Cookie 意味着在 Cookie 中存储信息。详情请参阅 应用程序集群
- token-cookie-path
- 在使用 Cookie 存储时,此选项设定用于存储帐户信息的 Cookie 路径。如果是相对路径,则假定应用程序在上下文 root 中运行,并且相对于该上下文 root。如果它是绝对路径,则使用绝对路径来设置 Cookie 路径。默认为使用相对于上下文 root 的路径。
- principal-attribute
-
OpenID Connect ID Token 属性,使用.如果令牌属性为空,则默认为
sub。可能的值有sub,preferred_username,email,name,nickname,given_name,family_name。 - turn-off-change-session-id-on-login
- 在某些平台上成功登录时,会话 ID 被修改,以插入安全攻击向量。如果您想要关闭该选项为 OPTIONAL,则将此更改为 true。默认值为 false。
- token-minimum-time-to-live
-
在 Red Hat Single Sign-On 服务器到期前,可以预先使用 Red Hat Single Sign-On 服务器刷新活跃的访问令牌的时间(以秒为单位)。这在将访问令牌发送到另一个 REST 客户端(在评估之前过期)时特别有用。这个值永不会超过 realm 的访问令牌期限。这是 选项。默认值为
0秒,因此适配器仅在过期时刷新访问令牌。 - min-time-between-jwks-requests
-
以秒为单位,指定对红帽单点登录的两个请求之间的最短间隔,以检索新的公钥。默认为 10 秒。当它识别了带有 unknown
kid的令牌时,适配器始终会尝试下载新公钥。但是,它不会每 10 秒尝试一次(默认为 )。这是当攻击者利用错误的kid强制适配器发送大量令牌时,为了避免 DoS 向红帽单点登录发送大量请求。 - public-key-cache-ttl
-
以秒为单位,指定对红帽单点登录的两个请求之间的最大间隔,以检索新的公钥。默认为 86400 秒(1 天)。当它识别了带有 unknown
kid的令牌时,适配器始终会尝试下载新公钥。如果它识别了具有已知kid的令牌,则只使用之前下载的公钥。但是,每个配置的时间间隔(默认为 1 天)将始终下载新公钥,即使已经知道了令牌的kid。 - ignore-oauth-query-parameter
-
默认值为
false,如果设为true,则会为 bearer 令牌处理access_token查询参数关闭处理。如果用户只在access_token中传递时,用户将无法进行身份验证 - redirect-rewrite-rules
-
如果需要,指定 Redirect URI 重写规则。这是一个对象表示法,键是要匹配的 Redirect URI 的正则表达式,值是替换 String。
$字符可用于替换字符串中的反向引用。 - verify-token-audience
-
如果设置为
true,则在使用 bearer 令牌进行身份验证时,适配器将验证令牌是否包含此客户端名称(资源)作为受众。选项对于服务特别有用,主要提供由 bearer 令牌身份验证的请求。默认设置为false,但为了提高安全性,建议启用它。有关 受众支持 的更多详情,请参阅 Audience 支持。
2.1.2. JBoss EAP 适配器 复制链接链接已复制到粘贴板!
您可以从 ZIP 文件或从 RPM 安装此适配器。
2.1.3. 从 ZIP 文件安装 JBOSS EAP 适配器 复制链接链接已复制到粘贴板!
为了保护在 JBoss EAP 上部署的 WAR 应用,您必须安装并配置 Red Hat Single Sign-On adapter 子系统。然后有两个选项来保护您的 WAR。
- 您可以在 WAR 中提供适配器配置文件,并将 auth-method 更改为 web.xml 中的 KEYCLOAK。
-
另外,您根本不需要修改 WAR,而且您可以通过配置文件中的 Red Hat Single Sign-On adapter 子系统配置保护它,如
standalone.xml。
本节中描述了这两种方法。
适配器作为单独的存档提供,具体取决于您使用的服务器版本。
流程
从 Sotware Downloads 站点安装适用于您的应用程序服务器的适配器。
在 JBoss EAP 7 上安装:
$ cd $EAP_HOME $ unzip rh-sso-7.5.3-eap7-adapter.zip在 JBoss EAP 6 上安装:
$ cd $EAP_HOME $ unzip rh-sso-7.5.3-eap6-adapter.zip此 ZIP 存档包含特定于 Red Hat Single Sign-On 适配器的 JBoss 模块。它还包含用于配置适配器子系统的 JBoss CLI 脚本。
要配置适配器子系统,请执行适当的命令。
如果服务器 未在运行,请在 JBoss EAP 7.1 上安装。
$ ./bin/jboss-cli.sh --file=bin/adapter-elytron-install-offline.cli注意JBoss EAP 6.4 不可用脱机脚本
如果服务器正在运行,则在 JBoss EAP 7.1 上安装 。
$ ./bin/jboss-cli.sh -c --file=bin/adapter-elytron-install.cli注意也可以在 JBoss EAP 7.1 或更高版本中使用旧的非Elytron 适配器,这意味着您可以使用
adapter-install-offline.cli在 JBoss EAP 6.4 上安装
$ ./bin/jboss-cli.sh -c --file=bin/adapter-install.cli
2.1.3.1. JBoss SSO 复制链接链接已复制到粘贴板!
JBoss EAP 内置了对部署到相同 JBoss EAP 实例的 Web 应用的单点登录支持。使用 Red Hat Single Sign-On 时不应该启用此功能。
2.1.3.2. 保护 WAR 复制链接链接已复制到粘贴板!
这部分论述了如何通过在 WAR 软件包中添加配置和编辑文件直接保护 WAR 的安全。
流程
在 WAR 的
WEB-INF目录中创建一个keycloak.json适配器配置文件。此配置文件的格式在 Java 适配器配置 部分描述。
-
在
web.xml中将auth-method设置为KEYCLOAK。 使用标准 servlet 安全性为您的 URL 指定角色基础限制。
例如:
<web-app 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_3_0.xsd" version="3.0"> <module-name>application</module-name> <security-constraint> <web-resource-collection> <web-resource-name>Admins</web-resource-name> <url-pattern>/admin/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>Customers</web-resource-name> <url-pattern>/customers/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>user</role-name> </auth-constraint> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> <login-config> <auth-method>KEYCLOAK</auth-method> <realm-name>this is ignored currently</realm-name> </login-config> <security-role> <role-name>admin</role-name> </security-role> <security-role> <role-name>user</role-name> </security-role> </web-app>
2.1.3.3. 通过适配器子系统保护 WAR 复制链接链接已复制到粘贴板!
您不必修改 WAR 以通过 Red Hat Single Sign-On 对其进行保护。相反,您可以通过 Red Hat Single Sign-On Adapter 子系统进行外部保护。虽然您不必将 KEYCLOAK 指定为 auth-method,但是您仍需要在 web.xml 中定义 security-constraints。但是,您不必创建一个 WEB-INF/keycloak.json 文件。在 Red Hat Single Sign-On 子系统定义中,元数据在服务器配置(standalone.xml)中定义。
<extensions>
<extension module="org.keycloak.keycloak-adapter-subsystem"/>
</extensions>
<profile>
<subsystem xmlns="urn:jboss:domain:keycloak:1.1">
<secure-deployment name="WAR MODULE NAME.war">
<realm>demo</realm>
<auth-server-url>http://localhost:8081/auth</auth-server-url>
<ssl-required>external</ssl-required>
<resource>customer-portal</resource>
<credential name="secret">password</credential>
</secure-deployment>
</subsystem>
</profile>
secure-deployment name 属性标识您要保护的 WAR。它的值是 web.xml 中定义的 module-name,并附加 .war。其余的配置与 Java 适配器 配置中定义的 keycloak.json 配置选项对应一个。
例外是 凭证 元素。
为了便于您,您可以进入 Red Hat Single Sign-On Admin Console,并转至此 WAR 与应用程序的客户端/安装选项卡。它提供了一个 XML 文件示例,您可以剪切和粘贴。
如果您有多个部署由同一域保护,您可以在单独的元素中共享 realm 配置。例如:
<subsystem xmlns="urn:jboss:domain:keycloak:1.1">
<realm name="demo">
<auth-server-url>http://localhost:8080/auth</auth-server-url>
<ssl-required>external</ssl-required>
</realm>
<secure-deployment name="customer-portal.war">
<realm>demo</realm>
<resource>customer-portal</resource>
<credential name="secret">password</credential>
</secure-deployment>
<secure-deployment name="product-portal.war">
<realm>demo</realm>
<resource>product-portal</resource>
<credential name="secret">password</credential>
</secure-deployment>
<secure-deployment name="database.war">
<realm>demo</realm>
<resource>database-service</resource>
<bearer-only>true</bearer-only>
</secure-deployment>
</subsystem>
2.1.3.4. 安全域 复制链接链接已复制到粘贴板!
安全上下文自动传播到 EJB 层。
2.1.4. 从 RPM 安装 JBoss EAP 7 适配器 复制链接链接已复制到粘贴板!
在 Red Hat Enterprise Linux 7 中,术语频道被使用术语仓库替代。在这些说明中,仅使用术语存储库。
前提条件
在从 RPM 安装 JBoss EAP 7 适配器之前,您必须订阅 JBoss EAP 7.4 存储库。
- 使用 Red Hat Subscription Manager 确保您的 Red Hat Enterprise Linux 系统已注册到您的帐户。如需更多信息,请参阅 红帽订阅管理文档。
如果您已订阅了另一个 JBoss EAP 存储库,必须先退订该存储库。
对于 Red Hat Enterprise Linux 6,7:使用 Red Hat Subscription Manager,使用以下命令订阅 JBoss EAP 7.4 存储库。根据您的 Red Hat Enterprise Linux 版本,将 <RHEL_VERSION> 替换为 6 或 7。
$ sudo subscription-manager repos --enable=jb-eap-7-for-rhel-<RHEL_VERSION>-server-rpms对于 Red Hat Enterprise Linux 8:使用 Red Hat Subscription Manager,使用以下命令订阅 JBoss EAP 7.4 存储库:
$ sudo subscription-manager repos --enable=jb-eap-7.4-for-rhel-8-x86_64-rpms --enable=rhel-8-for-x86_64-baseos-rpms --enable=rhel-8-for-x86_64-appstream-rpms
流程
根据您的 Red Hat Enterprise Linux 版本,为 OIDC 安装 JBoss EAP 7 适配器。
Install on Red Hat Enterprise Linux 6, 7:
$ sudo yum install eap7-keycloak-adapter-sso7_5在 Red Hat Enterprise Linux 8 中安装:
$ sudo dnf install eap7-keycloak-adapter-sso7_5注意RPM 安装的默认 EAP_HOME 路径为 /opt/rh/eap7/root/usr/share/wildfly。
为 OIDC 模块运行安装脚本。
$ $EAP_HOME/bin/jboss-cli.sh -c --file=$EAP_HOME/bin/adapter-install.cli
您的安装已完成。
2.1.5. 从 RPM 安装 JBoss EAP 6 适配器 复制链接链接已复制到粘贴板!
在 Red Hat Enterprise Linux 7 中,术语频道被使用术语仓库替代。在这些说明中,仅使用术语存储库。
您必须订阅 JBoss EAP 6 存储库,然后才能从 RPM 安装 EAP 6 适配器。
前提条件
- 使用 Red Hat Subscription Manager 确保您的 Red Hat Enterprise Linux 系统已注册到您的帐户。如需更多信息,请参阅 红帽订阅管理文档。
如果您已订阅了另一个 JBoss EAP 存储库,必须先退订该存储库。
使用以下命令,使用红帽订阅管理器订阅 JBoss EAP 6 存储库:根据您的 Red Hat Enterprise Linux 版本,将 <RHEL_VERSION> 替换为 6 或 7。
$ sudo subscription-manager repos --enable=jb-eap-6-for-rhel-<RHEL_VERSION>-server-rpms
流程
使用以下命令为 OIDC 安装 EAP 6 适配器:
$ sudo yum install keycloak-adapter-sso7_5-eap6注意RPM 安装的默认 EAP_HOME 路径为 /opt/rh/eap6/root/usr/share/wildfly。
为 OIDC 模块运行安装脚本。
$ $EAP_HOME/bin/jboss-cli.sh -c --file=$EAP_HOME/bin/adapter-install.cli
您的安装已完成。
2.1.6. JBoss Fuse 6 适配器 复制链接链接已复制到粘贴板!
红帽单点登录支持保护您的 Web 应用程序在 JBoss Fuse 6 中。
唯一支持的 Fuse 6 版本是最新的版本。如果您使用旧版本的 Fuse 6,则某些功能可能无法正常工作。特别是,Hawtio 集成不适用于早期版本的 Fuse 6。
Fuse 支持以下项目的安全性:
- 使用 Pax Web War 扩展器在 Fuse 上部署的经典 WAR 应用程序
- 使用 Pax Web Whiteboard Extender 在 Fuse 上部署的 Servlets 作为 OSGI 服务
- 使用 Camel Jetty 组件运行的 Apache Camel Jetty 端点
- 在其自己的独立 Jetty 引擎上运行的 Apache CXF 端点
- 在 CXF servlet 提供的默认引擎上运行的 Apache CXF 端点
- SSH 和 JMX 管理员访问权限
- Hawtio 管理控制台
2.1.6.1. 在 Fuse 6 中保护您的 Web 应用程序 复制链接链接已复制到粘贴板!
您必须首先安装 Red Hat Single Sign-On Karaf 功能。接下来,您将需要根据您要保护的应用程序类型执行这些步骤。所有引用的 web 应用程序都需要将 Red Hat Single Sign-On Jetty authenticator 注入底层 Jetty 服务器。实现此步骤的步骤取决于应用程序类型。详细信息如下所述。
2.1.6.2. 安装 Keycloak 功能 复制链接链接已复制到粘贴板!
您必须首先在 JBoss Fuse 环境中安装 keycloak 功能。keycloak 功能包括 Fuse 适配器和所有第三方依赖项。您可以从 Maven 存储库或从存档安装它。
2.1.6.2.1. 从 Maven 存储库安装 复制链接链接已复制到粘贴板!
前提条件
- 您必须在线并可访问 Maven 存储库。
对于 Red Hat Single Sign-On,配置正确的 Maven 存储库,以便您可以安装工件。如需更多信息,请参阅 JBoss Enterprise Maven 存储库 页面。
假设 Maven 存储库为 https://maven.repository.redhat.com/ga/,将以下内容添加到
$FUSE_HOME/etc/org.ops4j.pax.url.mvn.cfg文件,并将存储库添加到支持的仓库列表中。例如:org.ops4j.pax.url.mvn.repositories= \ https://maven.repository.redhat.com/ga/@id=redhat.product.repo http://repo1.maven.org/maven2@id=maven.central.repo, \ ...
流程
- 启动 JBoss Fuse 6.3.0 Rollup 12
在 Karaf 终端中键入:
features:addurl mvn:org.keycloak/keycloak-osgi-features/15.0.8.redhat-00001/xml/features features:install keycloak您可能还需要安装 Jetty 9 功能:
features:install keycloak-jetty9-adapter确定安装了功能:
features:list | grep keycloak
2.1.6.2.2. 从 ZIP 捆绑包安装 复制链接链接已复制到粘贴板!
如果您离线,或者不想使用 Maven 获取 JAR 文件和其他工件,这个安装选项很有用。
流程
- 从 Sotware Downloads 站点下载 Red Hat Single Sign-On Fuse adapter ZIP 归档。
将它解压缩到 JBoss Fuse 的根目录中。然后,依赖项安装
到系统目录下。您可以覆盖所有现有 jar 文件。将此用于 JBoss Fuse 6.3.0 Rollup 12:
cd /path-to-fuse/jboss-fuse-6.3.0.redhat-254 unzip -q /path-to-adapter-zip/rh-sso-7.5.3-fuse-adapter.zip启动 Fuse 并在 fuse/karaf 终端中运行这些命令:
features:addurl mvn:org.keycloak/keycloak-osgi-features/15.0.8.redhat-00001/xml/features features:install keycloak-
安装对应的 Jetty 适配器。由于工件直接在 JBoss Fuse
系统目录中可用,因此您不需要使用 Maven 存储库。
2.1.6.3. 保护经典 WAR 应用程序 复制链接链接已复制到粘贴板!
流程
在
/WEB-INF/web.xml文件中声明必要的:- <security-constraint> 元素中的安全约束
- <login-config> 元素中的登录配置
<security-role> 元素中的安全角色。
例如:
<?xml version="1.0" encoding="UTF-8"?> <web-app 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_3_0.xsd" version="3.0"> <module-name>customer-portal</module-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <security-constraint> <web-resource-collection> <web-resource-name>Customers</web-resource-name> <url-pattern>/customers/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>user</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>does-not-matter</realm-name> </login-config> <security-role> <role-name>admin</role-name> </security-role> <security-role> <role-name>user</role-name> </security-role> </web-app>
使用 authenticator 将
jetty-web.xml文件添加到/WEB-INF/jetty-web.xml文件中。例如:
<?xml version="1.0"?> <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"> <Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Get name="securityHandler"> <Set name="authenticator"> <New class="org.keycloak.adapters.jetty.KeycloakJettyAuthenticator"> </New> </Set> </Get> </Configure>-
在 WAR
/WEB-INF/目录中,创建一个新文件 keycloak.json。此配置文件的格式在 Java Adapters Config 部分中描述。另外,还可以使此文件在外部可用,如 配置外部适配器 中所述。 确保您的 WAR 应用程序导入
org.keycloak.adapters.jetty,可能META-INF/MANIFEST.MF文件,位于Import-Package标头下。在项目中使用maven-bundle-plugin,在清单中可以正确地生成 OSGI 标头。请注意,软件包的"*"解析不会导入org.keycloak.adapters.jetty软件包,因为它不被应用程序或 Blueprint 或 Spring 描述符使用,而是在jetty-web.xml文件中使用。要导入的软件包列表可能类似如下:
org.keycloak.adapters.jetty;version="15.0.8.redhat-00001", org.keycloak.adapters;version="15.0.8.redhat-00001", org.keycloak.constants;version="15.0.8.redhat-00001", org.keycloak.util;version="15.0.8.redhat-00001", org.keycloak.*;version="15.0.8.redhat-00001", *;resolution:=optional
2.1.6.3.1. 配置外部适配器 复制链接链接已复制到粘贴板!
如果您不想将 keycloak.json 适配器配置文件捆绑到 WAR 应用中,而是根据命名约定在外部提供并加载,请使用这个配置方法。
要启用这个功能,请将此部分添加到 /WEB_INF/web.xml 文件中:
<context-param>
<param-name>keycloak.config.resolver</param-name>
<param-value>org.keycloak.adapters.osgi.PathBasedKeycloakConfigResolver</param-value>
</context-param>
该组件使用 keycloak.config 或 karaf.etc java 属性搜索基本文件夹以查找配置。然后,在其中一个文件夹中搜索名为 < your_web_context>-keycloak.json 的文件。
因此,如果您的 web 应用程序具有上下文 my-portal,则您的适配器配置会从 $FUSE_HOME/etc/my-portal-keycloak.json 文件载入。
2.1.6.4. 保护部署为 OSGI 服务的 servlet 复制链接链接已复制到粘贴板!
如果您在 OSGI 捆绑项目中具有不部署为经典 WAR 应用的 servlet 类,您可以使用此方法。Fuse 使用 Pax Web Whiteboard 扩展器来部署此类 servlet,如 Web 应用程序。
流程
Red Hat Single Sign-On 提供
org.keycloak.adapters.osgi.undertow.PaxWebIntegrationService,它允许注入 jetty-web.xml 并为您的应用程序配置安全约束。您需要在应用程序中的OSGI-INF/blueprint/blueprint.xml文件中声明此类服务。请注意,servlet 需要依赖于它。配置示例:<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> <!-- Using jetty bean just for the compatibility with other fuse services --> <bean id="servletConstraintMapping" class="org.eclipse.jetty.security.ConstraintMapping"> <property name="constraint"> <bean class="org.eclipse.jetty.util.security.Constraint"> <property name="name" value="cst1"/> <property name="roles"> <list> <value>user</value> </list> </property> <property name="authenticate" value="true"/> <property name="dataConstraint" value="0"/> </bean> </property> <property name="pathSpec" value="/product-portal/*"/> </bean> <bean id="keycloakPaxWebIntegration" class="org.keycloak.adapters.osgi.PaxWebIntegrationService" init-method="start" destroy-method="stop"> <property name="jettyWebXmlLocation" value="/WEB-INF/jetty-web.xml" /> <property name="bundleContext" ref="blueprintBundleContext" /> <property name="constraintMappings"> <list> <ref component-id="servletConstraintMapping" /> </list> </property> </bean> <bean id="productServlet" class="org.keycloak.example.ProductPortalServlet" depends-on="keycloakPaxWebIntegration"> </bean> <service ref="productServlet" interface="javax.servlet.Servlet"> <service-properties> <entry key="alias" value="/product-portal" /> <entry key="servlet-name" value="ProductServlet" /> <entry key="keycloak.config.file" value="/keycloak.json" /> </service-properties> </service> </blueprint>-
您可能需要在项目内具有
WEB-INF目录(即使您的项目不是 Web 应用程序),并创建/WEB-INF/jetty-web.xml和/WEB-INF/keycloak.json文件,如 Classic WAR 应用 部分。请注意,您不需要web.xml文件作为 security-constraints 在蓝图配置文件中声明。
-
您可能需要在项目内具有
META-INF/MANIFEST.MF中的Import-Package必须至少包含这些导入:org.keycloak.adapters.jetty;version="15.0.8.redhat-00001", org.keycloak.adapters;version="15.0.8.redhat-00001", org.keycloak.constants;version="15.0.8.redhat-00001", org.keycloak.util;version="15.0.8.redhat-00001", org.keycloak.*;version="15.0.8.redhat-00001", *;resolution:=optional
2.1.6.5. 保护 Apache Camel 应用程序 复制链接链接已复制到粘贴板!
您可以通过使用 KeycloakJettyAuthenticator 添加 securityHandler 以及注入了正确的安全限制,保护通过 camel-jetty 组件实施的 Apache Camel 端点。您可以使用类似配置将 OSGI-INF/blueprint/blueprint.xml 文件添加到 Camel 应用程序。根据您的环境和需求,角色、安全约束映射和 Red Hat Single Sign-On 适配器配置可能会稍有不同。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camel="http://camel.apache.org/schema/blueprint"
xsi:schemaLocation="
http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<bean id="kcAdapterConfig" class="org.keycloak.representations.adapters.config.AdapterConfig">
<property name="realm" value="demo"/>
<property name="resource" value="admin-camel-endpoint"/>
<property name="bearerOnly" value="true"/>
<property name="authServerUrl" value="http://localhost:8080/auth" />
<property name="sslRequired" value="EXTERNAL"/>
</bean>
<bean id="keycloakAuthenticator" class="org.keycloak.adapters.jetty.KeycloakJettyAuthenticator">
<property name="adapterConfig" ref="kcAdapterConfig"/>
</bean>
<bean id="constraint" class="org.eclipse.jetty.util.security.Constraint">
<property name="name" value="Customers"/>
<property name="roles">
<list>
<value>admin</value>
</list>
</property>
<property name="authenticate" value="true"/>
<property name="dataConstraint" value="0"/>
</bean>
<bean id="constraintMapping" class="org.eclipse.jetty.security.ConstraintMapping">
<property name="constraint" ref="constraint"/>
<property name="pathSpec" value="/*"/>
</bean>
<bean id="securityHandler" class="org.eclipse.jetty.security.ConstraintSecurityHandler">
<property name="authenticator" ref="keycloakAuthenticator" />
<property name="constraintMappings">
<list>
<ref component-id="constraintMapping" />
</list>
</property>
<property name="authMethod" value="BASIC"/>
<property name="realmName" value="does-not-matter"/>
</bean>
<bean id="sessionHandler" class="org.keycloak.adapters.jetty.spi.WrappingSessionHandler">
<property name="handler" ref="securityHandler" />
</bean>
<bean id="helloProcessor" class="org.keycloak.example.CamelHelloProcessor" />
<camelContext id="blueprintContext"
trace="false"
xmlns="http://camel.apache.org/schema/blueprint">
<route id="httpBridge">
<from uri="jetty:http://0.0.0.0:8383/admin-camel-endpoint?handlers=sessionHandler&matchOnUriPrefix=true" />
<process ref="helloProcessor" />
<log message="The message from camel endpoint contains ${body}"/>
</route>
</camelContext>
</blueprint>
-
META-INF/MANIFEST.MF中的Import-Package需要包含这些导入:
javax.servlet;version="[3,4)",
javax.servlet.http;version="[3,4)",
org.apache.camel.*,
org.apache.camel;version="[2.13,3)",
org.eclipse.jetty.security;version="[9,10)",
org.eclipse.jetty.server.nio;version="[9,10)",
org.eclipse.jetty.util.security;version="[9,10)",
org.keycloak.*;version="15.0.8.redhat-00001",
org.osgi.service.blueprint,
org.osgi.service.blueprint.container,
org.osgi.service.event,
2.1.6.6. Camel RestDSL 复制链接链接已复制到粘贴板!
Camel RestDSL 是一种 Camel 功能,用于以流畅的方式定义 REST 端点。但是,您仍需要使用特定的实施类并提供如何与 Red Hat Single Sign-On 集成的说明。
配置集成机制的方式取决于配置 RestDSL 定义路由的 Camel 组件。
以下示例演示了如何使用 Jetty 组件配置集成,并引用前面 Blueprint 示例中定义的一些 Bean。
<bean id="securityHandlerRest" class="org.eclipse.jetty.security.ConstraintSecurityHandler">
<property name="authenticator" ref="keycloakAuthenticator" />
<property name="constraintMappings">
<list>
<ref component-id="constraintMapping" />
</list>
</property>
<property name="authMethod" value="BASIC"/>
<property name="realmName" value="does-not-matter"/>
</bean>
<bean id="sessionHandlerRest" class="org.keycloak.adapters.jetty.spi.WrappingSessionHandler">
<property name="handler" ref="securityHandlerRest" />
</bean>
<camelContext id="blueprintContext"
trace="false"
xmlns="http://camel.apache.org/schema/blueprint">
<restConfiguration component="jetty" contextPath="/restdsl"
port="8484">
<!--the link with Keycloak security handlers happens here-->
<endpointProperty key="handlers" value="sessionHandlerRest"></endpointProperty>
<endpointProperty key="matchOnUriPrefix" value="true"></endpointProperty>
</restConfiguration>
<rest path="/hello" >
<description>Hello rest service</description>
<get uri="/{id}" outType="java.lang.String">
<description>Just an helllo</description>
<to uri="direct:justDirect" />
</get>
</rest>
<route id="justDirect">
<from uri="direct:justDirect"/>
<process ref="helloProcessor" />
<log message="RestDSL correctly invoked ${body}"/>
<setBody>
<constant>(__This second sentence is returned from a Camel RestDSL endpoint__)</constant>
</setBody>
</route>
</camelContext>
2.1.6.7. 保护独立 Jetty 引擎上的 Apache CXF 端点 复制链接链接已复制到粘贴板!
流程
要运行由 Red Hat Single Sign-On 在单独的 Jetty 引擎上保护的 CXF 端点,请执行以下步骤:
将
META-INF/spring/beans.xml添加到您的应用中,并通过注入KeycloakJettyAuthenticator的 Jetty SecurityHandler 声明httpj:engine-factory。CFX JAX-WS 应用程序的配置可能类似如下:<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd http://cxf.apache.org/transports/http-jetty/configuration http://cxf.apache.org/schemas/configuration/http-jetty.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml" /> <bean id="kcAdapterConfig" class="org.keycloak.representations.adapters.config.AdapterConfig"> <property name="realm" value="demo"/> <property name="resource" value="custom-cxf-endpoint"/> <property name="bearerOnly" value="true"/> <property name="authServerUrl" value="http://localhost:8080/auth" /> <property name="sslRequired" value="EXTERNAL"/> </bean> <bean id="keycloakAuthenticator" class="org.keycloak.adapters.jetty.KeycloakJettyAuthenticator"> <property name="adapterConfig"> <ref local="kcAdapterConfig" /> </property> </bean> <bean id="constraint" class="org.eclipse.jetty.util.security.Constraint"> <property name="name" value="Customers"/> <property name="roles"> <list> <value>user</value> </list> </property> <property name="authenticate" value="true"/> <property name="dataConstraint" value="0"/> </bean> <bean id="constraintMapping" class="org.eclipse.jetty.security.ConstraintMapping"> <property name="constraint" ref="constraint"/> <property name="pathSpec" value="/*"/> </bean> <bean id="securityHandler" class="org.eclipse.jetty.security.ConstraintSecurityHandler"> <property name="authenticator" ref="keycloakAuthenticator" /> <property name="constraintMappings"> <list> <ref local="constraintMapping" /> </list> </property> <property name="authMethod" value="BASIC"/> <property name="realmName" value="does-not-matter"/> </bean> <httpj:engine-factory bus="cxf" id="kc-cxf-endpoint"> <httpj:engine port="8282"> <httpj:handlers> <ref local="securityHandler" /> </httpj:handlers> <httpj:sessionSupport>true</httpj:sessionSupport> </httpj:engine> </httpj:engine-factory> <jaxws:endpoint implementor="org.keycloak.example.ws.ProductImpl" address="http://localhost:8282/ProductServiceCF" depends-on="kc-cxf-endpoint" /> </beans>对于 CXF JAX-RS 应用,端点配置中的唯一区别可能取决于 engine-factory:
<jaxrs:server serviceClass="org.keycloak.example.rs.CustomerService" address="http://localhost:8282/rest" depends-on="kc-cxf-endpoint"> <jaxrs:providers> <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" /> </jaxrs:providers> </jaxrs:server>-
META-INF/MANIFEST.MF中的Import-Package必须包含这些导入:
META-INF.cxf;version="[2.7,3.2)",
META-INF.cxf.osgi;version="[2.7,3.2)";resolution:=optional,
org.apache.cxf.bus;version="[2.7,3.2)",
org.apache.cxf.bus.spring;version="[2.7,3.2)",
org.apache.cxf.bus.resource;version="[2.7,3.2)",
org.apache.cxf.transport.http;version="[2.7,3.2)",
org.apache.cxf.*;version="[2.7,3.2)",
org.springframework.beans.factory.config,
org.eclipse.jetty.security;version="[9,10)",
org.eclipse.jetty.util.security;version="[9,10)",
org.keycloak.*;version="15.0.8.redhat-00001"
2.1.6.8. 保护默认 Jetty Engine 上的 Apache CXF 端点 复制链接链接已复制到粘贴板!
一些服务会在启动时自动附带部署的 servlet。其中一个服务是在 http://localhost:8181/cxf 上下文中运行的 CXF servlet。保护此类端点可能会比较复杂。红帽单点登录当前正在使用的方法之一是 ServletReregistrationService,它在启动时取消部署内置的 servlet,可让您在 Red Hat Single Sign-On 的安全上下文中重新部署它。
应用程序中的配置文件 OSGI-INF/blueprint/blueprint.xml 可能类似如下。请注意,它添加了 JAX-RS 的客户服务端点,该端点特定于您的应用,但更重要的是,可保护整个 /cxf 上下文。
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs"
xsi:schemaLocation="
http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://cxf.apache.org/blueprint/jaxrs http://cxf.apache.org/schemas/blueprint/jaxrs.xsd">
<!-- JAXRS Application -->
<bean id="customerBean" class="org.keycloak.example.rs.CxfCustomerService" />
<jaxrs:server id="cxfJaxrsServer" address="/customerservice">
<jaxrs:providers>
<bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
</jaxrs:providers>
<jaxrs:serviceBeans>
<ref component-id="customerBean" />
</jaxrs:serviceBeans>
</jaxrs:server>
<!-- Securing of whole /cxf context by unregister default cxf servlet from paxweb and re-register with applied security constraints -->
<bean id="cxfConstraintMapping" class="org.eclipse.jetty.security.ConstraintMapping">
<property name="constraint">
<bean class="org.eclipse.jetty.util.security.Constraint">
<property name="name" value="cst1"/>
<property name="roles">
<list>
<value>user</value>
</list>
</property>
<property name="authenticate" value="true"/>
<property name="dataConstraint" value="0"/>
</bean>
</property>
<property name="pathSpec" value="/cxf/*"/>
</bean>
<bean id="cxfKeycloakPaxWebIntegration" class="org.keycloak.adapters.osgi.PaxWebIntegrationService"
init-method="start" destroy-method="stop">
<property name="bundleContext" ref="blueprintBundleContext" />
<property name="jettyWebXmlLocation" value="/WEB-INF/jetty-web.xml" />
<property name="constraintMappings">
<list>
<ref component-id="cxfConstraintMapping" />
</list>
</property>
</bean>
<bean id="defaultCxfReregistration" class="org.keycloak.adapters.osgi.ServletReregistrationService" depends-on="cxfKeycloakPaxWebIntegration"
init-method="start" destroy-method="stop">
<property name="bundleContext" ref="blueprintBundleContext" />
<property name="managedServiceReference">
<reference interface="org.osgi.service.cm.ManagedService" filter="(service.pid=org.apache.cxf.osgi)" timeout="5000" />
</property>
</bean>
</blueprint>
因此,在默认 CXF HTTP 目的地中运行的所有其他 CXF 服务也受到保护。同样,当取消部署应用时,整个 /cxf 上下文也会变得不安全。因此,将您自己的 Jetty 引擎用于您的应用程序,如 独立 Jetty Engine 上的 Secure CXF 应用程序 中所述,您可以更好地控制每个独立应用程序的安全性。
-
WEB-INF目录可能需要在您的项目内(即使您的项目不是 Web 应用)。您可能还需要以类似于 Classic WAR 应用程序的 方式编辑/WEB-INF/jetty-web.xml和/WEB-INF/keycloak.json文件。请注意,您不需要web.xml文件,因为蓝图配置文件中声明了安全约束。 -
META-INF/MANIFEST.MF中的Import-Package必须包含以下导入:
META-INF.cxf;version="[2.7,3.2)",
META-INF.cxf.osgi;version="[2.7,3.2)";resolution:=optional,
org.apache.cxf.transport.http;version="[2.7,3.2)",
org.apache.cxf.*;version="[2.7,3.2)",
com.fasterxml.jackson.jaxrs.json;version="[2.5,3)",
org.eclipse.jetty.security;version="[9,10)",
org.eclipse.jetty.util.security;version="[9,10)",
org.keycloak.*;version="15.0.8.redhat-00001",
org.keycloak.adapters.jetty;version="15.0.8.redhat-00001",
*;resolution:=optional
2.1.6.9. 保护 Fuse 管理服务 复制链接链接已复制到粘贴板!
2.1.6.9.1. 使用 SSH 身份验证到 Fuse 终端 复制链接链接已复制到粘贴板!
Red Hat Single Sign-On 主要解决了用于 Web 应用程序身份验证的用例;但是,如果您的其他 Web 服务和应用程序受 Red Hat Single Sign-On 保护,使用 Red Hat Single Sign-On 凭证保护非 Web 管理服务(如使用 Red Hat Single Sign-On 凭证的 SSH)是一个最好的 pcrice。您可以使用 JAAS 登录模块进行此操作,它允许远程连接 Red Hat Single Sign-On,并根据 Resource Owner Password Credentials 来验证凭据。
要启用 SSH 身份验证,请执行以下步骤。
流程
-
在 Red Hat Single Sign-On 中,创建一个客户端(例如
ssh-jmx-admin-client),它将用于 SSH 身份验证。此客户端需要在上选择直接访问 Grants Enabled。 在
$FUSE_HOME/etc/org.apache.karaf.shell.cfg文件中,更新或指定此属性:sshRealm=keycloak添加
$FUSE_HOME/etc/keycloak-direct-access.json文件,其中包含类似如下的内容(基于您的环境和 Red Hat Single Sign-On 客户端设置):{ "realm": "demo", "resource": "ssh-jmx-admin-client", "ssl-required" : "external", "auth-server-url" : "http://localhost:8080/auth", "credentials": { "secret": "password" } }此文件指定客户端应用配置,供 JAAS DirectAccessGrantsLoginModule 从
keycloakJAAS 域用于 SSH 身份验证。启动 Fuse 并安装
keycloakJAAS 域。最简单的方法是安装keycloak-jaas功能,它预定义了 JAAS 域。您可以使用您自己的keycloakJAAS 域覆盖功能的预定义域,并具有更高等级的等级。详情请查看 JBoss Fuse 文档。在 Fuse 终端中使用这些命令:
features:addurl mvn:org.keycloak/keycloak-osgi-features/15.0.8.redhat-00001/xml/features features:install keycloak-jaas以
admin用户身份使用 SSH 登录,在终端中输入以下内容:ssh -o PubkeyAuthentication=no -p 8101 admin@localhost-
使用密码登录。
在一些后续的操作系统中,您可能需要默认使用 SSH 命令的 -o 选项 -o HostKeyAlgorithms=+ssh-dss,因为稍后的 SSH 客户端不允许使用 ssh-dss 算法。但是,默认情况下,它目前在 JBoss Fuse 6.3.0 Rollup 12 中使用。
请注意,用户需要具有 realm 角色 admin 来执行所有操作或另一个角色,以执行一系列操作(例如,查看器 角色),可限制用户仅运行只读 Karaf 命令。可用的角色在 $FUSE_HOME/etc/org.apache.karaf.shell.cfg 或 $FUSE_HOME/system.properties 中进行配置。
2.1.6.9.2. 使用 JMX 验证 复制链接链接已复制到粘贴板!
如果要使用 jconsole 或其他外部工具通过 RMI 远程连接到 JMX,则可能需要 JMX 身份验证。否则,最好使用 hawt.io/jolokia,因为 jolokia 代理默认安装在 hawt.io 中。如需了解更多详细信息,请参阅 海军管理员管理员控制台。
流程
在
$FUSE_HOME/etc/org.apache.karaf.management.cfg文件中,将 jmxRealm 属性更改为:jmxRealm=keycloak-
安装
keycloak-jaas功能并配置$FUSE_HOME/etc/keycloak-direct-access.json文件,如上面的 SSH 部分所述。 - 在 jconsole 中,您可以使用以下 URL:
service:jmx:rmi://localhost:44444/jndi/rmi://localhost:1099/karaf-root
and credentials: admin/password (基于您的环境具有 admin 权限的用户)。
2.1.6.10. 保护 Hawtio 管理控制台 复制链接链接已复制到粘贴板!
要使用 Red Hat Single Sign-On 保护 Hawtio 管理控制台,请执行以下步骤:
流程
在
$FUSE_HOME/etc/system.properties文件中添加这些属性:hawtio.keycloakEnabled=true hawtio.realm=keycloak hawtio.keycloakClientConfig=file://${karaf.base}/etc/keycloak-hawtio-client.json hawtio.rolePrincipalClasses=org.keycloak.adapters.jaas.RolePrincipal,org.apache.karaf.jaas.boot.principal.RolePrincipal-
在您的域中,在 Red Hat Single Sign-On Admin Console 中创建客户端。例如,在 Red Hat Single Sign-On
demorealm 中,创建一个客户端hawtio-client,将public指定为 Access Type,并指定指向 Hawtio 的重定向 URI:您还必须配置对应的 Web Origin (本例中为 http://localhost:8181)。 -
使用以下示例中所示的内容,在
$FUSE_HOME/etc目录中创建keycloak-hawtio-client.json文件。根据您的 Red Hat Single Sign-On 环境,更改realm、资源和auth-server-url属性。resource属性必须指向上一步中创建的客户端。此文件供客户端(Hawtio JavaScript 应用)侧使用。
{
"realm" : "demo",
"resource" : "hawtio-client",
"auth-server-url" : "http://localhost:8080/auth",
"ssl-required" : "external",
"public-client" : true
}
使用以下示例中所示的内容,在
$FUSE_HOME/etcdicrectory 中创建keycloak-hawtio.json文件。根据您的红帽单点登录环境,更改realm和auth-server-url属性。此文件供服务器(JAAS 登录模块)中的适配器使用。{ "realm" : "demo", "resource" : "jaas", "bearer-only" : true, "auth-server-url" : "http://localhost:8080/auth", "ssl-required" : "external", "use-resource-role-mappings": false, "principal-attribute": "preferred_username" }启动 JBoss Fuse 6.3.0 Rollup 12 并安装 keycloak 功能(如果您还没有这么做)。Karaf 终端中的命令与此示例类似:
features:addurl mvn:org.keycloak/keycloak-osgi-features/15.0.8.redhat-00001/xml/features features:install keycloak进入 http://localhost:8181/hawtio,并以 Red Hat Single Sign-On 域的用户身份登录。
请注意,用户需要适当的域角色才能成功向 Hawtio 进行身份验证。可在
hawtio.roles中的$FUSE_HOME/etc/system.properties文件中配置可用的角色。
2.1.6.10.1. 在 JBoss EAP 6.4 上保护 Hawtio 复制链接链接已复制到粘贴板!
前提条件
设置 Red Hat Single Sign-On,如 保护 Hawtio 管理控制台 中所述。假设:
-
您有 Red Hat Single Sign-On realm
demo和 clienthawtio-client -
您的 Red Hat Single Sign-On 正在
localhost:8080上运行 -
部署了 Hawtio 的 JBoss EAP 6.4 服务器将在
localhost:8181上运行。此服务器的目录在接下来的步骤中被称为$EAP_HOME。
流程
-
将
hawtio-wildfly-1.4.0.redhat-630396.war归档复制到$EAP_HOME/standalone/configuration目录。有关部署 Hawtio 的详情,请参阅 Fuse Hawtio 文档。 -
将
keycloak-hawtio.json和keycloak-hawtio-client.json文件复制到$EAP_HOME/standalone/configuration目录。 - 按照 JBoss 适配器 文档 中所述,将 Red Hat Single Sign-On adapter 子系统安装到您的 JBoss EAP 6.4 服务器。
在
$EAP_HOME/standalone/configuration/standalone.xml文件中,将系统属性配置为本例中所示:<extensions> ... </extensions> <system-properties> <property name="hawtio.authenticationEnabled" value="true" /> <property name="hawtio.realm" value="hawtio" /> <property name="hawtio.roles" value="admin,viewer" /> <property name="hawtio.rolePrincipalClasses" value="org.keycloak.adapters.jaas.RolePrincipal" /> <property name="hawtio.keycloakEnabled" value="true" /> <property name="hawtio.keycloakClientConfig" value="${jboss.server.config.dir}/keycloak-hawtio-client.json" /> <property name="hawtio.keycloakServerConfig" value="${jboss.server.config.dir}/keycloak-hawtio.json" /> </system-properties>在
security-domains部分将 Hawtio 域添加到同一文件中:<security-domain name="hawtio" cache-type="default"> <authentication> <login-module code="org.keycloak.adapters.jaas.BearerTokenLoginModule" flag="required"> <module-option name="keycloak-config-file" value="${hawtio.keycloakServerConfig}"/> </login-module> </authentication> </security-domain>将
secure-deployment部分hawtio添加到 adapter 子系统。这可确保 Hawtio WAR 可以找到 JAAS 登录模块类。<subsystem xmlns="urn:jboss:domain:keycloak:1.1"> <secure-deployment name="hawtio-wildfly-1.4.0.redhat-630396.war" /> </subsystem>使用 Hawtio 重新启动 JBoss EAP 6.4 服务器:
cd $EAP_HOME/bin ./standalone.sh -Djboss.socket.binding.port-offset=101- 访问地址为 http://localhost:8181/hawtio.它受 Red Hat Single Sign-On 的安全。
2.1.7. JBoss Fuse 7 Adapter 复制链接链接已复制到粘贴板!
红帽单点登录支持在 JBoss Fuse 7 中运行 Web 应用程序的安全。
JBoss Fuse 7 使用 Undertow 适配器,它与 JBoss Fuse 7 适配器 和 JBoss Fuse 7.4.0 捆绑在一起,在 covers 和 Undertow 下用于运行各种 Web 应用。
唯一支持的 Fuse 7 版本是最新的版本。如果您使用较早版本的 Fuse 7,则某些功能可能无法正常工作。特别是,对于低于 7.0.1 的 Fuse 7 版本,集成不能在所有这些工作。
Fuse 支持以下项目的安全性:
- 使用 Pax Web War 扩展器在 Fuse 上部署的经典 WAR 应用程序
- 在 Fuse 上部署的 OSGI 服务时带有 Pax Web Whiteboard 扩展器,另外还通过 org.osgi.service.http.HttpService#registerServlet ()(标准 OSGi 企业 HTTP 服务)注册的 servlet
- 使用 Camel Undertow 组件运行的 Apache Camel Undertow 端点
- 在其自己的独立 Undertow 引擎上运行的 Apache CXF 端点
- 在 CXF servlet 提供的默认引擎上运行的 Apache CXF 端点
- SSH 和 JMX 管理员访问权限
- Hawtio 管理控制台
2.1.7.1. 在 Fuse 7 中保护您的 Web 应用程序 复制链接链接已复制到粘贴板!
您必须首先安装 Red Hat Single Sign-On Karaf 功能。接下来,您将需要根据您要保护的应用程序类型执行这些步骤。所有引用的 Web 应用都需要将 Red Hat Single Sign-On Undertow 身份验证机制注入到底层 Web 服务器。实现此步骤的步骤取决于应用程序类型。详细信息如下所述。
2.1.7.2. 安装 Keycloak 功能 复制链接链接已复制到粘贴板!
您必须首先在 JBoss Fuse 环境中安装 keycloak-pax-http-undertow 和 keycloak-jaas 功能。keycloak-pax-http-undertow 功能包括 Fuse 适配器和所有第三方依赖项。keycloak-jaas 包含 realm 用于 SSH 和 JMX 验证的 JAAS 模块。您可以从 Maven 存储库或从存档安装它。
2.1.7.2.1. 从 Maven 存储库安装 复制链接链接已复制到粘贴板!
前提条件
- 您必须在线并可访问 Maven 存储库。
- 对于 Red Hat Single Sign-On,配置正确的 Maven 存储库,以便您可以安装工件。如需更多信息,请参阅 JBoss Enterprise Maven 存储库 页面。
假设 Maven 存储库为 https://maven.repository.redhat.com/ga/,将以下内容添加到
$FUSE_HOME/etc/org.ops4j.pax.url.mvn.cfg文件,并将存储库添加到支持的仓库列表中。例如:config:edit org.ops4j.pax.url.mvn config:property-append org.ops4j.pax.url.mvn.repositories ,https://maven.repository.redhat.com/ga/@id=redhat.product.repo config:update feature:repo-refresh
流程
- 启动 JBoss Fuse 7.4.0
在 Karaf 终端中,键入:
feature:repo-add mvn:org.keycloak/keycloak-osgi-features/15.0.8.redhat-00001/xml/features feature:install keycloak-pax-http-undertow keycloak-jaas您可能还需要安装 Undertow 功能:
feature:install pax-http-undertow确定安装了功能:
feature:list | grep keycloak
2.1.7.2.2. 从 ZIP 捆绑包安装 复制链接链接已复制到粘贴板!
如果您离线,或者不想使用 Maven 获取 JAR 文件和其他工件,这将非常有用。
流程
- 从 Sotware Downloads 站点下载 Red Hat Single Sign-On Fuse adapter ZIP 归档。
将它解压缩到 JBoss Fuse 的根目录中。然后,依赖项安装
到系统目录下。您可以覆盖所有现有 jar 文件。将此用于 JBoss Fuse 7.4.0:
cd /path-to-fuse/fuse-karaf-7.z unzip -q /path-to-adapter-zip/rh-sso-7.5.3-fuse-adapter.zip启动 Fuse 并在 fuse/karaf 终端中运行这些命令:
feature:repo-add mvn:org.keycloak/keycloak-osgi-features/15.0.8.redhat-00001/xml/features feature:install keycloak-pax-http-undertow keycloak-jaas-
安装对应的 Undertow 适配器。由于工件直接在 JBoss Fuse
系统目录中可用,因此您不需要使用 Maven 存储库。
2.1.7.3. 保护经典 WAR 应用程序 复制链接链接已复制到粘贴板!
流程
在
/WEB-INF/web.xml文件中声明必要的:- <security-constraint> 元素中的安全约束
-
<login-config> 元素中的登录配置。确保 <
auth-method>是KEYCLOAK。 <security-role> 元素中的安全角色
例如:
<?xml version="1.0" encoding="UTF-8"?> <web-app 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_3_0.xsd" version="3.0"> <module-name>customer-portal</module-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <security-constraint> <web-resource-collection> <web-resource-name>Customers</web-resource-name> <url-pattern>/customers/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>user</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>KEYCLOAK</auth-method> <realm-name>does-not-matter</realm-name> </login-config> <security-role> <role-name>admin</role-name> </security-role> <security-role> <role-name>user</role-name> </security-role> </web-app>
在 WAR
/WEB-INF/目录中,创建一个新文件 keycloak.json。此配置文件的格式在 Java Adapters Config 部分中描述。另外,还可以使此文件在外部可用,如 配置外部适配器 中所述。例如:
{ "realm": "demo", "resource": "customer-portal", "auth-server-url": "http://localhost:8080/auth", "ssl-required" : "external", "credentials": { "secret": "password" } }- 与 Fuse 6 适配器不同,MANIFEST.MF 中不需要特殊的 OSGi 导入。
2.1.7.3.1. 配置解析器 复制链接链接已复制到粘贴板!
keycloak.json 适配器配置文件可存储在捆绑包中,它是默认的行为,或者在文件系统的目录中。要指定配置文件的实际源,请将 keycloak.config.resolver 部署参数设置为所需的配置解析器类。例如,在典型的 WAR 应用程序中,按照如下所示在 web.xml 文件中设置 keycloak.config.resolver 上下文参数:
<context-param>
<param-name>keycloak.config.resolver</param-name>
<param-value>org.keycloak.adapters.osgi.PathBasedKeycloakConfigResolver</param-value>
</context-param>
以下解析器可用于 keycloak.config.resolver :
- org.keycloak.adapters.osgi.BundleBasedKeycloakConfigResolver
-
这是默认的解析器。在受保护的 OSGi 捆绑中,配置文件有正常的。默认情况下,它会加载名为
WEB-INF/keycloak.json的文件,但可以通过configLocation属性配置此文件名。 - org.keycloak.adapters.osgi.PathBasedKeycloakConfigResolver
此解析器会在由
的文件。如果没有设置keycloak.config系统属性指定的文件夹中搜索名为 <your_web_context>-keycloak.jsonkeycloak.config,则使用karaf.etc系统属性。例如,如果您的 web 应用程序被部署到上下文
my-portal中,那么您的适配器配置将从${keycloak.config}/my-portal-keycloak.json文件或${karaf.etc}/my-portal-keycloak.json载入。- org.keycloak.adapters.osgi.HierarchicalPathBasedKeycloakConfigResolver
这个解析器与上面的
PathBasedKeycloakConfigResolver类似,其中给定 URI 路径,配置位置从大多数到最低特定的部分进行检查。例如,对于
/my/web-app/contextURI,则会搜索以下配置位置是否存在,直到第一个配置位置存在:-
${karaf.etc}/my-web-app-context-keycloak.json -
${karaf.etc}/my-web-app-keycloak.json -
${karaf.etc}/my-keycloak.json -
${karaf.etc}/keycloak.json
-
2.1.7.4. 保护部署为 OSGI 服务的 servlet 复制链接链接已复制到粘贴板!
如果您在 OSGI 捆绑项目中具有不部署为经典 WAR 应用的 servlet 类,您可以使用此方法。Fuse 使用 Pax Web Whiteboard 扩展器来部署此类 servlet,如 Web 应用程序。
流程
Red Hat Single Sign-On 提供
org.keycloak.adapters.osgi.undertow.PaxWebIntegrationService,它允许为您的应用程序配置身份验证方法和安全性约束。您需要在应用程序中的OSGI-INF/blueprint/blueprint.xml文件中声明此类服务。请注意,servlet 需要依赖于它。配置示例:<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> <bean id="servletConstraintMapping" class="org.keycloak.adapters.osgi.PaxWebSecurityConstraintMapping"> <property name="roles"> <list> <value>user</value> </list> </property> <property name="authentication" value="true"/> <property name="url" value="/product-portal/*"/> </bean> <!-- This handles the integration and setting the login-config and security-constraints parameters --> <bean id="keycloakPaxWebIntegration" class="org.keycloak.adapters.osgi.undertow.PaxWebIntegrationService" init-method="start" destroy-method="stop"> <property name="bundleContext" ref="blueprintBundleContext" /> <property name="constraintMappings"> <list> <ref component-id="servletConstraintMapping" /> </list> </property> </bean> <bean id="productServlet" class="org.keycloak.example.ProductPortalServlet" depends-on="keycloakPaxWebIntegration" /> <service ref="productServlet" interface="javax.servlet.Servlet"> <service-properties> <entry key="alias" value="/product-portal" /> <entry key="servlet-name" value="ProductServlet" /> <entry key="keycloak.config.file" value="/keycloak.json" /> </service-properties> </service> </blueprint>您可能需要在项目内具有
WEB-INF目录(即使您的项目不是 Web 应用),并创建/WEB-INF/keycloak.json文件,如 Classic WAR 应用 部分中所述。请注意,您不需要web.xml文件作为 security-constraints 在蓝图配置文件中声明。- 与 Fuse 6 适配器不同,MANIFEST.MF 中不需要特殊的 OSGi 导入。
2.1.7.5. 保护 Apache Camel 应用程序 复制链接链接已复制到粘贴板!
您可以通过蓝图注入正确的安全限制,使用 camel-undertow 组件实施 Apache Camel 端点,并将使用的组件更新为 undertow-keycloak。您必须使用类似配置在 Camel 应用程序中添加 OSGI-INF/blueprint/blueprint.xml 文件。角色、安全约束映射和适配器配置可能会根据您的环境和需求稍有不同。
与标准的 undertow 组件相比,undertow-keycloak 组件会添加两个新属性:
-
configResolver是一个提供 Red Hat Single Sign-On 适配器配置的解析器 Bean。可用解析器会在 Configuration Resolvers 部分列出。 -
allowedRoles是一个以逗号分隔的角色列表。访问该服务的用户必须至少有一个角色才能允许访问。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camel="http://camel.apache.org/schema/blueprint"
xsi:schemaLocation="
http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint-2.17.1.xsd">
<bean id="keycloakConfigResolver" class="org.keycloak.adapters.osgi.BundleBasedKeycloakConfigResolver" >
<property name="bundleContext" ref="blueprintBundleContext" />
</bean>
<bean id="helloProcessor" class="org.keycloak.example.CamelHelloProcessor" />
<camelContext id="blueprintContext"
trace="false"
xmlns="http://camel.apache.org/schema/blueprint">
<route id="httpBridge">
<from uri="undertow-keycloak:http://0.0.0.0:8383/admin-camel-endpoint?matchOnUriPrefix=true&configResolver=#keycloakConfigResolver&allowedRoles=admin" />
<process ref="helloProcessor" />
<log message="The message from camel endpoint contains ${body}"/>
</route>
</camelContext>
</blueprint>
-
META-INF/MANIFEST.MF中的Import-Package需要包含这些导入:
javax.servlet;version="[3,4)",
javax.servlet.http;version="[3,4)",
javax.net.ssl,
org.apache.camel.*,
org.apache.camel;version="[2.13,3)",
io.undertow.*,
org.keycloak.*;version="15.0.8.redhat-00001",
org.osgi.service.blueprint,
org.osgi.service.blueprint.container
2.1.7.6. Camel RestDSL 复制链接链接已复制到粘贴板!
Camel RestDSL 是一种 Camel 功能,用于以流畅的方式定义 REST 端点。但是,您仍需要使用特定的实施类并提供如何与 Red Hat Single Sign-On 集成的说明。
配置集成机制的方式取决于配置 RestDSL 定义路由的 Camel 组件。
以下示例演示了如何使用 undertow-keycloak 组件配置集成,并引用前面 Blueprint 示例中定义的一些 Bean。
<camelContext id="blueprintContext"
trace="false"
xmlns="http://camel.apache.org/schema/blueprint">
<!--the link with Keycloak security handlers happens by using undertow-keycloak component -->
<restConfiguration apiComponent="undertow-keycloak" contextPath="/restdsl" port="8484">
<endpointProperty key="configResolver" value="#keycloakConfigResolver" />
<endpointProperty key="allowedRoles" value="admin,superadmin" />
</restConfiguration>
<rest path="/hello" >
<description>Hello rest service</description>
<get uri="/{id}" outType="java.lang.String">
<description>Just a hello</description>
<to uri="direct:justDirect" />
</get>
</rest>
<route id="justDirect">
<from uri="direct:justDirect"/>
<process ref="helloProcessor" />
<log message="RestDSL correctly invoked ${body}"/>
<setBody>
<constant>(__This second sentence is returned from a Camel RestDSL endpoint__)</constant>
</setBody>
</route>
</camelContext>
2.1.7.7. 在单独的 Undertow Engine 上保护 Apache CXF 端点 复制链接链接已复制到粘贴板!
若要在单独的 Undertow 引擎上运行红帽单点登录保护的 CXF 端点,请执行以下步骤:
流程
将
OSGI-INF/blueprint/blueprint.xml添加到您的应用中,然后添加正确的配置解析器与 Camel 配置 类似。在httpu:engine-factory中,使用 camel 配置声明org.keycloak.adapters.osgi.undertow.CxfKeycloakAuthHandler处理程序。CFX JAX-WS 应用程序的配置可能类似如下:<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/blueprint/jaxws" xmlns:cxf="http://cxf.apache.org/blueprint/core" xmlns:httpu="http://cxf.apache.org/transports/http-undertow/configuration". xsi:schemaLocation=" http://cxf.apache.org/transports/http-undertow/configuration http://cxf.apache.org/schemas/configuration/http-undertow.xsd http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd http://cxf.apache.org/blueprint/jaxws http://cxf.apache.org/schemas/blueprint/jaxws.xsd"> <bean id="keycloakConfigResolver" class="org.keycloak.adapters.osgi.BundleBasedKeycloakConfigResolver" > <property name="bundleContext" ref="blueprintBundleContext" /> </bean> <httpu:engine-factory bus="cxf" id="kc-cxf-endpoint"> <httpu:engine port="8282"> <httpu:handlers> <bean class="org.keycloak.adapters.osgi.undertow.CxfKeycloakAuthHandler"> <property name="configResolver" ref="keycloakConfigResolver" /> </bean> </httpu:handlers> </httpu:engine> </httpu:engine-factory> <jaxws:endpoint implementor="org.keycloak.example.ws.ProductImpl" address="http://localhost:8282/ProductServiceCF" depends-on="kc-cxf-endpoint"/> </blueprint>对于 CXF JAX-RS 应用,端点配置中的唯一区别可能取决于 engine-factory:
<jaxrs:server serviceClass="org.keycloak.example.rs.CustomerService" address="http://localhost:8282/rest" depends-on="kc-cxf-endpoint"> <jaxrs:providers> <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" /> </jaxrs:providers> </jaxrs:server>-
META-INF/MANIFEST.MF中的Import-Package必须包含这些导入:
META-INF.cxf;version="[2.7,3.3)",
META-INF.cxf.osgi;version="[2.7,3.3)";resolution:=optional,
org.apache.cxf.bus;version="[2.7,3.3)",
org.apache.cxf.bus.spring;version="[2.7,3.3)",
org.apache.cxf.bus.resource;version="[2.7,3.3)",
org.apache.cxf.transport.http;version="[2.7,3.3)",
org.apache.cxf.*;version="[2.7,3.3)",
org.springframework.beans.factory.config,
org.keycloak.*;version="15.0.8.redhat-00001"
2.1.7.8. 保护默认 Undertow Engine 上的 Apache CXF 端点 复制链接链接已复制到粘贴板!
一些服务会在启动时自动附带部署的 servlet。其中一个服务是在 http://localhost:8181/cxf 上下文中运行的 CXF servlet。Fuse 的 Pax Web 支持通过配置管理员更改现有上下文。这可用来保护 Red Hat Single Sign-On 的端点。
应用程序中的配置文件 OSGI-INF/blueprint/blueprint.xml 可能类似如下。请注意,它添加了 JAX-RS 客户服务端点,该端点特定于您的应用。
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs"
xsi:schemaLocation="
http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://cxf.apache.org/blueprint/jaxrs http://cxf.apache.org/schemas/blueprint/jaxrs.xsd">
<!-- JAXRS Application -->
<bean id="customerBean" class="org.keycloak.example.rs.CxfCustomerService" />
<jaxrs:server id="cxfJaxrsServer" address="/customerservice">
<jaxrs:providers>
<bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
</jaxrs:providers>
<jaxrs:serviceBeans>
<ref component-id="customerBean" />
</jaxrs:serviceBeans>
</jaxrs:server>
</blueprint>
另外,您必须创建 ${karaf.etc}/org.ops4j.pax.web.context-anyName.cfg 文件。它将被视为由 pax-web-runtime 捆绑包跟踪的工厂 PID 配置。这种配置可能包含以下与标准 web.xml 的一些属性对应的属性:
bundle.symbolicName = org.apache.cxf.cxf-rt-transports-http
context.id = default
context.param.keycloak.config.resolver = org.keycloak.adapters.osgi.HierarchicalPathBasedKeycloakConfigResolver
login.config.authMethod = KEYCLOAK
security.cxf.url = /cxf/customerservice/*
security.cxf.roles = admin, user
有关配置管理员文件中可用属性的完整描述,请参阅 Fuse 文档。以上属性的含义如下:
bundle.symbolicNameandcontext.id-
识别
org.ops4j.pax.web.service.WebContainer中的捆绑包及其部署上下文。 context.param.keycloak.config.resolver-
为捆绑包提供
keycloak.config.resolver上下文参数的值,与适用于典型 WAR 的 web.xml 中的web.xml相同。在 Configuration Resolvers 部分中介绍了可用的解析器。 login.config.authMethod-
身份验证方法.必须为
KEYCLOAK。 security.anyName.url和security.anyName.roles单个安全约束的属性值正如分别在
security-constraint/web-resource-collection/url-pattern和security-constraint/auth-constraint/role-name中设置。角色用逗号和空格分开。anyName标识符可以是任意名称,但必须匹配同一安全约束的独立属性。注意某些 Fuse 版本包含一个错误,需要由
"、"(comma 和单个空格)分隔角色。确保使用精确此表示法来分隔角色。
META-INF/MANIFEST.MF 中的 Import-Package 必须至少包含这些导入:
javax.ws.rs;version="[2,3)",
META-INF.cxf;version="[2.7,3.3)",
META-INF.cxf.osgi;version="[2.7,3.3)";resolution:=optional,
org.apache.cxf.transport.http;version="[2.7,3.3)",
org.apache.cxf.*;version="[2.7,3.3)",
com.fasterxml.jackson.jaxrs.json;version="${jackson.version}"
2.1.7.9. 保护 Fuse 管理服务 复制链接链接已复制到粘贴板!
2.1.7.9.1. 使用 SSH 身份验证到 Fuse 终端 复制链接链接已复制到粘贴板!
Red Hat Single Sign-On 主要解决了用于 Web 应用程序身份验证的用例;但是,如果您的其他 Web 服务和应用程序受 Red Hat Single Sign-On 保护,使用 Red Hat Single Sign-On 凭证保护非 Web 管理服务(如使用 Red Hat Single Sign-On 凭证的 SSH)是一个最好的 pcrice。您可以使用 JAAS 登录模块进行此操作,它允许远程连接 Red Hat Single Sign-On,并根据 Resource Owner Password Credentials 来验证凭据。
要启用 SSH 身份验证,请执行以下步骤。
流程
-
在 Red Hat Single Sign-On 中,创建一个客户端(例如
ssh-jmx-admin-client),它将用于 SSH 身份验证。此客户端需要在上选择直接访问 Grants Enabled。 在
$FUSE_HOME/etc/org.apache.karaf.shell.cfg文件中,更新或指定此属性:sshRealm=keycloak添加
$FUSE_HOME/etc/keycloak-direct-access.json文件,其中包含类似如下的内容(基于您的环境和 Red Hat Single Sign-On 客户端设置):{ "realm": "demo", "resource": "ssh-jmx-admin-client", "ssl-required" : "external", "auth-server-url" : "http://localhost:8080/auth", "credentials": { "secret": "password" } }此文件指定客户端应用配置,供 JAAS DirectAccessGrantsLoginModule 从
keycloakJAAS 域用于 SSH 身份验证。启动 Fuse 并安装
keycloakJAAS 域。最简单的方法是安装keycloak-jaas功能,它预定义了 JAAS 域。您可以使用您自己的keycloakJAAS 域覆盖功能的预定义域,并具有更高等级的等级。详情请查看 JBoss Fuse 文档。在 Fuse 终端中使用这些命令:
features:addurl mvn:org.keycloak/keycloak-osgi-features/15.0.8.redhat-00001/xml/features features:install keycloak-jaas以
admin用户身份使用 SSH 登录,在终端中输入以下内容:ssh -o PubkeyAuthentication=no -p 8101 admin@localhost-
使用密码登录。
在一些后续的操作系统中,您可能需要默认使用 SSH 命令的 -o 选项 -o HostKeyAlgorithms=+ssh-dss,因为稍后的 SSH 客户端不允许使用 ssh-dss 算法。但是,默认情况下,它目前在 JBoss Fuse 7.4.0 中使用。
请注意,用户需要具有 realm 角色 admin 来执行所有操作或另一个角色,以执行一系列操作(例如,查看器 角色),可限制用户仅运行只读 Karaf 命令。可用的角色在 $FUSE_HOME/etc/org.apache.karaf.shell.cfg 或 $FUSE_HOME/system.properties 中进行配置。
2.1.7.9.2. 使用 JMX 验证 复制链接链接已复制到粘贴板!
如果要使用 jconsole 或其他外部工具通过 RMI 远程连接到 JMX,则可能需要 JMX 身份验证。否则,最好使用 hawt.io/jolokia,因为 jolokia 代理默认安装在 hawt.io 中。如需了解更多详细信息,请参阅 海军管理员管理员控制台。
要使用 JMX 身份验证,请执行以下步骤:
流程
在
$FUSE_HOME/etc/org.apache.karaf.management.cfg文件中,将 jmxRealm 属性更改为:jmxRealm=keycloak-
安装
keycloak-jaas功能并配置$FUSE_HOME/etc/keycloak-direct-access.json文件,如上面的 SSH 部分所述。 - 在 jconsole 中,您可以使用以下 URL:
service:jmx:rmi://localhost:44444/jndi/rmi://localhost:1099/karaf-root
and credentials: admin/password (基于您的环境具有 admin 权限的用户)。
2.1.7.10. 保护 Hawtio 管理控制台 复制链接链接已复制到粘贴板!
要使用 Red Hat Single Sign-On 保护 Hawtio 管理控制台,请执行以下步骤:
流程
-
在您的域中,在 Red Hat Single Sign-On Admin Console 中创建客户端。例如,在 Red Hat Single Sign-On
demorealm 中,创建一个客户端hawtio-client,将public指定为 Access Type,并指定指向 Hawtio 的重定向 URI:配置对应的 Web Origin (本例中为 http://localhost:8181)。设置客户端范围映射,以在hawtio-client客户端详情中包含 帐户 客户端客户端的 view-profile 客户端角色。 使用以下示例中所示的内容,在
$FUSE_HOME/etc目录中创建keycloak-hawtio-client.json文件。根据您的 Red Hat Single Sign-On 环境,更改realm、资源和auth-server-url属性。resource属性必须指向上一步中创建的客户端。此文件供客户端(Hawtio JavaScript 应用)侧使用。{ "realm" : "demo", "clientId" : "hawtio-client", "url" : "http://localhost:8080/auth", "ssl-required" : "external", "public-client" : true }使用以下示例中所示的内容,在
$FUSE_HOME/etc目录中创建keycloak-direct-access.json文件。根据您的 Red Hat Single Sign-On 环境更改realm和url属性。此文件供 JavaScript 客户端使用。{ "realm" : "demo", "resource" : "ssh-jmx-admin-client", "auth-server-url" : "http://localhost:8080/auth", "ssl-required" : "external", "credentials": { "secret": "password" } }使用以下示例中所示的内容,在
$FUSE_HOME/etcdicrectory 中创建keycloak-hawtio.json文件。根据您的红帽单点登录环境,更改realm和auth-server-url属性。此文件供服务器(JAAS 登录模块)中的适配器使用。{ "realm" : "demo", "resource" : "jaas", "bearer-only" : true, "auth-server-url" : "http://localhost:8080/auth", "ssl-required" : "external", "use-resource-role-mappings": false, "principal-attribute": "preferred_username" }启动 JBoss Fuse 7.4.0 ,安装 Keycloak 功能。然后在 Karaf 终端中键入:
system:property -p hawtio.keycloakEnabled true system:property -p hawtio.realm keycloak system:property -p hawtio.keycloakClientConfig file://\${karaf.base}/etc/keycloak-hawtio-client.json system:property -p hawtio.rolePrincipalClasses org.keycloak.adapters.jaas.RolePrincipal,org.apache.karaf.jaas.boot.principal.RolePrincipal restart io.hawt.hawtio-war进入 http://localhost:8181/hawtio,并以 Red Hat Single Sign-On 域的用户身份登录。
请注意,用户需要适当的域角色才能成功向 Hawtio 进行身份验证。可在
hawtio.roles中的$FUSE_HOME/etc/system.properties文件中配置可用的角色。
2.1.8. Spring Boot adapter 复制链接链接已复制到粘贴板!
Spring Boot Adapter 已被弃用,不会包含在 8.0 及更高版本的 RH-SSO 中。此适配器将在 RH-SSO 7.x 生命周期中维护。用户应迁移到 Spring Security,以便将其 Spring Boot 应用与 RH-SSO 集成。
2.1.8.1. 安装 Spring Boot 适配器 复制链接链接已复制到粘贴板!
为了保证 Spring Boot 应用的安全,您必须将 Keycloak Spring Boot 适配器 JAR 添加到应用程序中。然后您必须通过普通的 Spring Boot 配置(application.properties)提供一些额外的配置。
Keycloak Spring Boot 适配器利用 Spring Boot 的自动配置优势,因此所有您需要这样做的目的是将这个适配器 Keycloak Spring Boot starter 添加到您的项目中。
流程
要使用 Maven 将初学者添加到项目中,请在依赖项中添加以下内容:
<dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-spring-boot-starter</artifactId> </dependency>添加 Adapter BOM 依赖项:
<dependencyManagement> <dependencies> <dependency> <groupId>org.keycloak.bom</groupId> <artifactId>keycloak-adapter-bom</artifactId> <version>15.0.8.redhat-00001</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
目前支持以下嵌入式容器,在使用 Starter 时不需要任何额外的依赖项:
- tomcat
- Undertow
- Jetty
2.1.8.2. 配置 Spring Boot Adapter 复制链接链接已复制到粘贴板!
使用流程将 Spring Boot 应用配置为使用 Red Hat Single Sign-On。
流程
您可以通过普通的 Spring Boot 配置来配置 Spring Boot 适配器的域,而不是
keycloak.json文件。例如:keycloak.realm = demorealm keycloak.auth-server-url = http://127.0.0.1:8080/auth keycloak.ssl-required = external keycloak.resource = demoapp keycloak.credentials.secret = 11111111-1111-1111-1111-111111111111 keycloak.use-resource-role-mappings = true您可以通过设置
keycloak.enabled = false来禁用 Keycloak Spring Boot Adapter (例如在测试中)。-
要配置 Policy Enforcer,与 keycloak.json 不同,请使用
policy-enforcer-config而不是policy-enforcer。 指定通常位于
web.xml中的 Jakarta EE 安全性配置。Spring Boot Adapter 会将
login-method设置为KEYCLOAK,并在启动时配置security-constraints。以下是配置示例:keycloak.securityConstraints[0].authRoles[0] = admin keycloak.securityConstraints[0].authRoles[1] = user keycloak.securityConstraints[0].securityCollections[0].name = insecure stuff keycloak.securityConstraints[0].securityCollections[0].patterns[0] = /insecure keycloak.securityConstraints[1].authRoles[0] = admin keycloak.securityConstraints[1].securityCollections[0].name = admin stuff keycloak.securityConstraints[1].securityCollections[0].patterns[0] = /admin
如果您计划将 Spring 应用程序部署为 WAR,则不应使用 Spring Boot Adapter,并为应用服务器或 servlet 容器使用专用的适配器。您的 Spring Boot 还应包含 web.xml 文件。
2.1.9. Java servlet 过滤器适配器 复制链接链接已复制到粘贴板!
如果您在没有 Red Hat Single Sign-On 适配器的平台上部署 Java Servlet 应用程序,则您选择使用 servlet 过滤器适配器。这个适配器的工作方式与其他适配器不同。在 web.xml 中定义安全约束。而是使用 Red Hat Single Sign-On servlet 过滤器适配器定义一个过滤器映射来保护您要安全的 url 模式。
Backchannel logout 的工作方式与标准适配器不同。它不会无效的 HTTP 会话,而是将其标记为已注销的会话 ID。没有标准的方法来基于会话 ID 使 HTTP 会话无效。
<web-app 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_3_0.xsd"
version="3.0">
<module-name>application</module-name>
<filter>
<filter-name>Keycloak Filter</filter-name>
<filter-class>org.keycloak.adapters.servlet.KeycloakOIDCFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Keycloak Filter</filter-name>
<url-pattern>/keycloak/*</url-pattern>
<url-pattern>/protected/*</url-pattern>
</filter-mapping>
</web-app>
在上面的代码片段中有两个 url-patterns。/protected/* 是我们需要保护的文件,而 /keycloak/* url-pattern 处理来自 Red Hat Single Sign-On 服务器的回调。
如果您需要在配置的 url-patterns 下排除一些路径,您可以使用 Filter init-param keycloak.config.skipPattern 来配置一个正则表达式,用于描述 keycloak 过滤器应立即分配给 filter-chain 的 path-pattern。默认情况下不配置 skipPattern。
模式与没有 上下文路径 的 requestURI 匹配。如果 context-path /myapp a request for /myapp/index.html 将根据跳过模式与 /index.html 匹配。
<init-param>
<param-name>keycloak.config.skipPattern</param-name>
<param-value>^/(path1|path2|path3).*</param-value>
</init-param>
请注意,您应该在 Red Hat Single Sign-On Admin Console 中配置客户端,使用指向过滤器的 url-pattern 所涵盖的安全部分的 Admin URL。
Admin URL 将向 Admin URL 发出回调,以便执行类似后端注销的操作。因此,本例中的 Admin URL 应为 http[s]://hostname/{context-root}/keycloak。
如果需要自定义会话 ID 映射程序,您可以在 Filter init-param keycloak.config.idMapper 中配置类的完全限定域名。会话 ID 映射用户 ID 和会话 ID 的一个映射程序。默认情况下,配置了 org.keycloak.adapters.spi.InMemorySessionIdMapper。
<init-param>
<param-name>keycloak.config.idMapper</param-name>
<param-value>org.keycloak.adapters.spi.InMemorySessionIdMapper</param-value>
</init-param>
Red Hat Single Sign-On 过滤器具有与其他适配器相同的配置参数,但您必须将它们定义为过滤 initparams 而不是上下文参数。
要使用此过滤器,请将此 maven 工件包括在您的 WAR poms 中:
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-servlet-filter-adapter</artifactId>
<version>15.0.8.redhat-00001</version>
</dependency>
2.1.10. 安全上下文 复制链接链接已复制到粘贴板!
如果您需要直接访问令牌,可以使用 KeycloakSecurityContext 接口。如果您要从令牌检索附加详情(如用户配置文件信息),或者您要调用由 Red Hat Single Sign-On 保护的 RESTful 服务,这可能很有用。
在 servlet 环境中,可在安全调用中作为 HttpServletRequest 中的属性提供:
httpServletRequest
.getAttribute(KeycloakSecurityContext.class.getName());
或者,它在 HttpSession 中的不安全请求中可用:
httpServletRequest.getSession()
.getAttribute(KeycloakSecurityContext.class.getName());
2.1.11. 错误处理 复制链接链接已复制到粘贴板!
Red Hat Single Sign-On 为基于 servlet 的客户端适配器有一些错误处理工具。在身份验证过程中遇到错误时,Red Hat Single Sign-On 将调用 HttpServletResponse.sendError ()。您可以在 web.xml 文件中设置错误页面,以处理错误,但您想要。Red Hat Single Sign-On 可以抛出 400、401、403 和 500 错误。
<error-page>
<error-code>403</error-code>
<location>/ErrorHandler</location>
</error-page>
Red Hat Single Sign-On 还设置您可以检索的 HttpServletRequest 属性。属性名称是 org.keycloak.adapters.spi.AuthenticationError,它应该被转换为 org.keycloak.adapters.OIDCAuthenticationError。
例如:
import org.keycloak.adapters.OIDCAuthenticationError;
import org.keycloak.adapters.OIDCAuthenticationError.Reason;
...
OIDCAuthenticationError error = (OIDCAuthenticationError) httpServletRequest
.getAttribute('org.keycloak.adapters.spi.AuthenticationError');
Reason reason = error.getReason();
System.out.println(reason.name());
2.1.12. 退出 复制链接链接已复制到粘贴板!
您可以以多种方式从 Web 应用程序注销。对于 Jakarta EE servlet 容器,您可以调用 HttpServletRequest.logout ()。对于其他浏览器应用,您可以将浏览器重定向到 http://auth-server/auth/realms/{realm-name}/protocol/openid-connect/logout?redirect_uri=encodedRedirectUri,如果您与浏览器有 SSO 会话,您会注销。
在使用 HttpServletRequest.logout () 选项时,适配器针对 Red Hat Single Sign-On 服务器通过刷新令牌执行 back-channel POST 调用。如果方法从未受保护的页面(一个没有检查有效令牌的页面)执行,则刷新令牌不可用,在这种情况下,适配器会跳过调用。因此,建议使用一个受保护的页面来执行 HttpServletRequest.logout (),以便当前令牌始终考虑帐户,并在需要时执行与红帽单点登录服务器的交互。
如果您想要避免作为注销过程的一部分注销外部身份提供程序,您可以提供 启动_idp 参数,并将值是问题中身份提供程序的身份(别名)。当作为由外部身份提供程序启动的单个注销的一部分调用 logout 端点时,这非常有用。
2.1.13. 参数转发 复制链接链接已复制到粘贴板!
Red Hat Single Sign-On 初始授权端点请求支持不同的参数。大多数参数均在 OIDC 规范 中描述。适配器根据适配器配置自动添加一些参数。但是,还有一些参数可以逐个调用来添加。打开受保护的应用程序 URI 时,特定的参数将转发到 Red Hat Single Sign-On 授权端点。
例如,如果您请求离线令牌,您可以使用 scope 参数打开受保护的应用程序 URI:
http://myappserver/mysecuredapp?scope=offline_access
参数 scope=offline_access 将自动转发到 Red Hat Single Sign-On 授权端点。
支持的参数有:
-
Scope - 使用空格分隔的范围列表。空格分隔的列表通常参考特定 客户端上定义的客户端范围。请注意,范围
openid将始终添加到适配器的范围列表中。例如,如果您输入范围选项地址电话,则 Red Hat Single Sign-On 的请求将包含范围参数scope=openid 地址电话。 提示 - Red Hat Single Sign-On 支持这些设置:
-
login- SSO 将被忽略,并且始终会显示 Red Hat Single Sign-On 登录页面,即使该用户已经通过身份验证 -
同意- 仅对具有必要条件的客户端适用。如果使用了,则始终会显示 Consent 页面,即使用户之前授予这个客户端。 -
none- 不会显示登录页面;相反,用户将重定向到应用程序,如果用户还没有通过身份验证,则会出现错误。此设置允许您在应用程序一侧创建一个过滤器/中断器,并向用户显示自定义错误页面。请参阅规格中的更多详情。
-
-
max_age - 仅在用户已经通过身份验证时才使用。指定在用户进行身份验证时从 中保留验证的允许最长时间。如果用户通过身份验证的时间超过
maxAge,则 SSO 将被忽略,并且必须重新验证。 - login_hint - 用于预先填充登录格式的用户名/电子邮件字段。
- kc_idp_hint - 用于告诉 Red Hat Single Sign-On 以跳过显示登录页面并自动重定向到指定的身份提供程序。如需了解更多信息,请参阅 身份提供程序文档。
大多数参数均在 OIDC 规范中 描述。唯一的例外是参数 kc_idp_hint,它特定于 Red Hat Single Sign-On,它含有自动使用的身份提供程序的名称。如需更多信息,请参阅《 服务器管理指南》 中的 Identity Brokering 部分。
如果使用附加参数打开 URL,如果您已在应用程序中验证,则适配器不会将您重定向到 Red Hat Single Sign-On。例如,如果您已向应用程序 mysecuredapp 进行身份验证,打开 http://myappserver/mysecuredapp?prompt=login 不会自动将您重定向到 Red Hat Single Sign-On 登录页面。以后的可能会更改此行为。
2.1.14. 客户端身份验证 复制链接链接已复制到粘贴板!
当机密 OIDC 客户端需要发送 backchannel 请求(例如,为令牌交换代码,或刷新令牌)时,它需要针对 Red Hat Single Sign-On 服务器进行身份验证。默认情况下,可以通过三种方式验证客户端:客户端 ID 和客户端机密,客户端使用签名 JWT 进行身份验证,或使用客户端机密通过签名的 JWT 进行客户端身份验证。
2.1.14.1. 客户端 ID 和客户端 Secret 复制链接链接已复制到粘贴板!
这是 OAuth2 规范中介绍的传统方法。客户端有一个 secret,需要同时识别适配器(应用程序)和 Red Hat Single Sign-On 服务器。您可以在 Red Hat Single Sign-On Admin 控制台中生成特定客户端的机密,然后将此 secret 粘贴到应用程序侧的 keycloak.json 文件中:
"credentials": {
"secret": "19666a4f-32dd-4049-b082-684c74115f28"
}
2.1.14.2. 使用签名 JWT 进行客户端身份验证 复制链接链接已复制到粘贴板!
这基于 RFC7523 规范。它以这种方式工作:
-
客户端必须具有私钥和证书。对于 Red Hat Single Sign-On,这可以通过传统的
密钥存储文件获得,该文件可在客户端应用的类路径上或文件系统中某个位置提供。 - 客户端应用程序启动后,它允许以 JWKS 格式下载其公钥,使用 http://myhost.com/myapp/k_jwks 等 URL 来下载其公钥,假设 http://myhost.com/myapp 是客户端应用程序的基本 URL。此 URL 可以被 Red Hat Single Sign-On 使用(请参阅以下)。
-
在身份验证过程中,客户端会生成一个 JWT 令牌,并使用其私钥为其签名,并将其发送到特定后端请求的红帽单点登录(如 code-to-token 请求)在
client_assertion参数中。 Red Hat Single Sign-On 必须具有客户端的公钥或证书,以便它可以验证 JWT 上的签名。在 Red Hat Single Sign-On 中,您需要为客户端配置客户端凭证。首先,您需要在管理控制台的选项卡
凭据中选择签署的JWT作为验证客户端的方法。然后您可以选择在密钥选项卡中之一:-
配置 JWKS URL,Red Hat Single Sign-On 可下载客户端的公钥。这可以是 URL,如 http://myhost.com/myapp/k_jwks(请参阅上述信息)。这个选项最为灵活,因为客户端可以随时轮转其密钥,而红帽单点登录则始终在需要时下载新密钥,而无需更改配置。更准确地说,当 Red Hat Single Sign-On 在看到由 unknown
kid签名的令牌(密钥 ID)时下载新密钥。 - 以 PEM 格式、JWK 格式或从密钥存储上传客户端的公钥或证书。使用此选项时,公钥被硬编码,在客户端生成新密钥对时必须更改。如果您尚未提供自己的红帽单点登录管理控制台,您也可以从红帽单点登录管理控制台生成自己的密钥存储。有关如何设置 Red Hat Single Sign-On Admin Console 的详情,请参考 服务器管理指南。
-
配置 JWKS URL,Red Hat Single Sign-On 可下载客户端的公钥。这可以是 URL,如 http://myhost.com/myapp/k_jwks(请参阅上述信息)。这个选项最为灵活,因为客户端可以随时轮转其密钥,而红帽单点登录则始终在需要时下载新密钥,而无需更改配置。更准确地说,当 Red Hat Single Sign-On 在看到由 unknown
对于在适配器中设置,您需要在 keycloak.json 文件中具有类似如下的内容:
"credentials": {
"jwt": {
"client-keystore-file": "classpath:keystore-client.jks",
"client-keystore-type": "JKS",
"client-keystore-password": "storepass",
"client-key-password": "keypass",
"client-key-alias": "clientkey",
"token-expiration": 10
}
}
使用此配置时,密钥存储文件 keystore-client.jks 必须在您的 WAR 的 classpath 上可用。如果不使用前缀 classpath: 您可以指向运行客户端应用程序的文件系统中的任何文件。
2.1.15. 多租户 复制链接链接已复制到粘贴板!
在我们的上下文中,多 Tenancy 意味着单个目标应用程序(WAR)可以通过多个红帽单点登录域进行保护。域可以位于同一红帽单点登录实例或不同的实例上。
实际上,这意味着应用程序需要有多个 keycloak.json 适配器配置文件。
您可以使用部署到不同 context-paths 的不同适配器配置文件来有多个 WAR 实例。但是,这可能会不方便,您可能还希望根据 context-path 以外的其他内容选择该域。
Red Hat Single Sign-On 可以有自定义配置解析器,以便您可以选择哪个适配器配置用于每个请求。
要实现此目的,您需要首先创建一个实现 org.keycloak.adapters.KeycloakConfigResolver。例如:
package example;
import org.keycloak.adapters.KeycloakConfigResolver;
import org.keycloak.adapters.KeycloakDeployment;
import org.keycloak.adapters.KeycloakDeploymentBuilder;
public class PathBasedKeycloakConfigResolver implements KeycloakConfigResolver {
@Override
public KeycloakDeployment resolve(OIDCHttpFacade.Request request) {
if (path.startsWith("alternative")) {
KeycloakDeployment deployment = cache.get(realm);
if (null == deployment) {
InputStream is = getClass().getResourceAsStream("/tenant1-keycloak.json");
return KeycloakDeploymentBuilder.build(is);
}
} else {
InputStream is = getClass().getResourceAsStream("/default-keycloak.json");
return KeycloakDeploymentBuilder.build(is);
}
}
}
您还需要配置将 KeycloakConfigResolver 实现用于 web.xml 中的 keycloak.config.resolver context-param:
<web-app>
...
<context-param>
<param-name>keycloak.config.resolver</param-name>
<param-value>example.PathBasedKeycloakConfigResolver</param-value>
</context-param>
</web-app>
2.1.16. 应用程序集群 复制链接链接已复制到粘贴板!
本章与支持部署到 JBoss EAP 的集群应用相关。
根据您的应用程序是否提供了一些选项:
- 无状态或有状态
- 可分发(复制的 http 会话)或不可分发的
- 依赖于负载均衡器提供的粘性会话
- 在与 Red Hat Single Sign-On 相同的域中托管
处理集群的过程并不像常规应用程序一样简单。主要的原因是浏览器和服务器端应用程序都向 Red Hat Single Sign-On 发送请求,因此它并不像在您的负载平衡器上启用粘性会话一样简单。
2.1.16.1. 无状态令牌存储 复制链接链接已复制到粘贴板!
默认情况下,Red Hat Single Sign-On 的 Web 应用程序使用 HTTP 会话来存储安全上下文。这意味着您必须启用粘性会话或复制 HTTP 会话。
作为在 HTTP 会话中存储安全上下文的替代方案,可将适配器配置为将其存储在 Cookie 中。如果您要使应用程序无状态或者不想将安全上下文存储在 HTTP 会话中,这将非常有用。
要使用 Cookie 存储保存安全上下文,请编辑应用程序 WEB-INF/keycloak.json 并添加:
"token-store": "cookie"
token-store 的默认值为 session,它会在 HTTP 会话中保存安全上下文。
使用 Cookie 存储的一个限制是,在 Cookie 中为每个 HTTP 请求传递了整个安全上下文。这会影响性能。
另一种小限制是无限限制,对单点的支持有限。如果 init servlet 注销(HttpServletRequest.logout)从应用程序本身删除 KEYCLOAK_ADAPTER_STATE cookie,则它无法正常工作。但是,从不同应用程序初始化后退通道注销不会由 Red Hat Single Sign-On 传播到使用 Cookie 存储的应用程序。因此,建议为访问令牌超时使用短值(例如 1 分钟)。
有些负载均衡器不允许任何粘性会话 Cookie 名称或内容配置,如 Amazon ALB。对于这些情况,建议将 shouldAttachRoute 选项设置为 false。
2.1.16.2. 相对 URI 优化 复制链接链接已复制到粘贴板!
在部署的情况下,Red Hat Single Sign-On 和应用程序被托管在同一域(通过反向代理或负载均衡器)上,最好在客户端配置中使用相对 URI 选项。
使用相对 URI,URI 被解析为用于访问 Red Hat Single Sign-On 的 URL。
例如,如果您的应用程序的 URL 是 https://acme.org/myapp,Red Hat Single Sign-On 的 URL 为 https://acme.org/auth,那么您可以使用 redirect-uri /myapp 而不是 https://acme.org/myapp。
2.1.16.3. 管理员 URL 配置 复制链接链接已复制到粘贴板!
您可以在 Red Hat Single Sign-On Admin 控制台中配置特定客户端的管理员 URL。Red Hat Single Sign-On 服务器使用它来将后端请求发送到应用程序以进行各种任务,如注销用户或推送吊销策略。
例如,backchannel logout 的工作方式是:
- 用户从一个应用程序发送注销请求
- 应用程序向 Red Hat Single Sign-On 发送注销请求
- Red Hat Single Sign-On 服务器使用户会话无效
- 然后,Red Hat Single Sign-On 服务器使用与会话关联的 admin url 发送 backchannel 请求到应用程序
- 当应用程序收到注销请求时,它会使对应的 HTTP 会话无效
如果 admin URL 包含 ${application.session.host},它将被替换为与 HTTP 会话关联的节点的 URL。
2.1.16.4. 注册应用程序节点 复制链接链接已复制到粘贴板!
上一节中介绍了 Red Hat Single Sign-On 如何向与特定 HTTP 会话关联的节点发送注销请求。但是,在某些情况下,管理员可能希望将管理任务传播到所有注册的集群节点,而不仅仅是它们中的一个。例如,要在策略之前不向应用程序推送新内容,或者从应用程序注销所有用户。
在这种情况下,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 中也被取消注册该节点,这通常是在节点关闭或应用程序取消部署过程中。没有调用非部署监听器时,这可能无法正常工作,这会导致自动取消注册
默认禁用发送启动注册和定期重新注册,因为只有一些集群应用程序需要它。
启用该功能编辑应用程序的 WEB-INF/keycloak.json 文件并添加:
"register-node-at-startup": true,
"register-node-period": 600,
这意味着适配器会在启动时发送注册请求,并每 10 分钟重新注册。
在 Red Hat Single Sign-On Admin Console 中,您可以指定最大节点重新注册超时(应该大于适配器配置中的 register-node-period )。您还可以通过 Admin 控制台手动添加和删除集群节点,这在不想依赖于自动注册功能时很有用,或者在不使用自动取消注册功能时删除过时的应用程序节点会很有用。
2.1.16.5. 每个请求中的刷新令牌 复制链接链接已复制到粘贴板!
默认情况下,应用程序适配器仅在访问令牌过期时刷新访问令牌。但是,您还可以将适配器配置为在每次请求上刷新令牌。这可能会对性能产生影响,因为您的应用会将更多的请求发送到红帽单点登录服务器。
启用该功能编辑应用程序的 WEB-INF/keycloak.json 文件并添加:
"always-refresh-token": true
这可能会对性能有显著影响。只有在您不能依赖后端信息传播且不要在策略前传播时,才启用这个功能。要考虑的另一个因素是,默认访问令牌具有较短的过期时间,因此即使注销没有传播,令牌将在注销的几分钟内过期。