第 9 章 策略强制器


策略强制点(PEP)是一种设计模式,因此您可以以不同的方式实施它。红帽构建的 Keycloak 提供了为不同平台、环境和编程语言实施 PEP 所需的所有方法。红帽构建的 Keycloak 授权服务提供了一个 RESTful API,并使用集中式授权服务器利用 OAuth2 授权功能进行精细的授权。

PEP overview

PEP 负责红帽构建的 Keycloak 服务器的访问决策,其中通过评估与受保护的资源关联的策略来实现这些决策。它充当应用程序中的过滤器或拦截器,以便根据这些决策授予的权限,检查对受保护资源的特定请求是否可以满足。

Red Hat build of Keycloak 提供内置的支持,为启用红帽为 Java 应用程序 构建的 Keycloak 策略Enforcer Enforcer 提供内置支持,以保护 JakartaEE 兼容的框架和 Web 容器。如果使用 Maven,您应该为项目配置以下依赖项:

<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-policy-enforcer</artifactId>
    <version>${keycloak.version}</version>
</dependency>
Copy to Clipboard Toggle word wrap

当您启用策略强制程序时,发送到应用程序的所有请求都会被截获,并被授予对受保护的资源的访问权限,具体取决于红帽构建 Keycloak 向发出请求的权限。

策略强制通过红帽构建的 Keycloak 管理控制台与应用程序的路径和您为资源服务器创建的资源相关联。???默认情况下,当创建资源服务器时,红帽构建的 Keycloak 会为资源服务器创建一个 默认配置,以便您可以快速启用策略强制。

9.1. Configuration

策略强制器配置使用 JSON 格式,以及大多数不需要设置任何时间,如果您想要根据资源服务器中可用的资源自动解析受保护的路径。

如果要手动定义受保护的资源,您可以使用稍微更详细的格式:

{
  "enforcement-mode" : "ENFORCING",
  "paths": [
    {
      "path" : "/users/*",
      "methods" : [
        {
          "method": "GET",
          "scopes" : ["urn:app.com:scopes:view"]
        },
        {
          "method": "POST",
          "scopes" : ["urn:app.com:scopes:create"]
        }
      ]
    }
  ]
}
Copy to Clipboard Toggle word wrap

以下是每个配置选项的描述:

  • enforcement-mode

    指定策略的强制执行方式。

    • ENFORCING

      (默认模式)默认拒绝请求,即使没有策略与给定资源关联。

    • PERMISSIVE

      即使没有与给定资源关联的策略,也允许请求。

    • DISABLED

      完全禁用策略评估并允许访问任何资源。当 强制模式DISABLED 时,应用程序仍然能够通过 Authorization 上下文获取红帽构建的 Keycloak 授予的所有权限

  • on-deny-redirect-to

    定义一个 URL,当从服务器获取"access denied"消息时,客户端请求会被重定向。默认情况下,适配器会使用 403 HTTP 状态代码进行响应。

  • path-cache

    定义策略实施器应如何跟踪应用程序和红帽构建的 Keycloak 中定义的路径之间的关联。为了避免对红帽构建的 Keycloak 服务器进行不必要的请求,需要在路径和受保护的资源之间缓存关联,以避免对红帽构建的 Keycloak 服务器进行不必要的请求。

    • Lifespan

      定义条目应过期的时间(毫秒)。如果没有提供,则默认值为 30000。等于 0 的值可以被设置为完全禁用缓存。这样设置一个等于 -1 的值来禁用缓存的过期。

    • max-entries

      定义应保存在缓存中的条目限制。如果没有提供,则默认值为 1000

  • paths

    指定要保护的路径。这个配置是可选的。如果没有定义,策略强制程序通过在 Keycloak 的红帽构建中获取您定义的资源来发现所有路径,其中这些资源使用代表应用程序中的一些路径的 URIS 定义。

    • name

      要与给定路径关联的服务器上的资源名称。与 路径 一起使用时,策略强制程序会忽略资源的 URIS 属性,并使用您提供的路径。

    • path

      (必需)相对于应用程序上下文路径的 URI。如果指定了这个选项,策略 enforcer 会查询服务器以获取具有相同值的 URI 的资源。目前支持路径匹配的基本逻辑。有效路径示例如下:

      • wildcard: IANA
      • 后缀: IANA.html
      • 子路径: /path the
      • 路径参数: /resource/{id}
      • 完全匹配: /resource
      • patterns: /{version}/resource, /api/{version}/resource, /api/{version}/resource945
    • 方法

      HTTP 方法(如 GET、POST、PATCH)来保护以及它们如何与服务器中给定资源的范围关联。

      • 方法

        HTTP 方法的名称。

      • 范围

        与方法关联的范围相关的字符串数组。当您将范围与特定方法关联时,尝试访问受保护的资源(或路径)的客户端必须提供一个 RPT,授予列表中指定的所有范围的权限。例如,如果您使用 scope create 定义 POST 方法,RPT 必须包含在对路径执行 POST 时授予对 create 范围的访问权限。

      • scopes-enforcement-mode

        引用与方法关联的范围的强制模式的字符串。值可以是 ALLANY。如果 ALL,则必须授予所有定义的范围,才能使用此方法访问资源。如果 ANY,应授予至少一个范围,以便使用此方法访问该资源。默认情况下,强制模式设置为 ALL

    • enforcement-mode

      指定策略的强制执行方式。

      • ENFORCING

        (默认模式)默认拒绝请求,即使没有与给定资源关联的策略。

      • DISABLED
    • claim-information-point

      定义必须解决并推送到 Keycloak 服务器的红帽构建的一个或多个声明,以便这些声明可供策略使用。如需了解更多详细信息,请参阅声明信息点

  • lazy-load-paths

    指定适配器应该如何获取与应用程序中路径关联的资源。如果为 true,策略强制器将使用请求的路径相应地获取资源。当您不希望在部署过程中从服务器获取所有资源(如果您未提供 路径),或者您只定义了一组子路径,并希望按需获取其他路径,则此配置特别有用。

  • http-method-as-scope

    指定范围应如何映射到 HTTP 方法。如果设置为 true,策略强制器将使用当前请求的 HTTP 方法来检查是否应授予访问权限。启用后,请确保您的 Keycloak 中的资源与代表您要保护的每个 HTTP 方法的范围相关联。

  • claim-information-point

    定义必须解决并推送到 Keycloak 服务器的红帽构建的一个或多个 全局 声明,以便这些声明可供策略使用。如需了解更多详细信息,请参阅声明信息点

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat