9.2. 声明信息点


声明信息点(CIP)负责解析声明并将这些声明推送到红帽 Keycloak 服务器,以提供有关策略访问上下文的更多信息。它们可以定义为 policy-enforcer 的配置选项,以便从不同源解析声明,例如:

  • HTTP 请求(参数、标头、正文等)
  • 外部 HTTP 服务
  • 配置中定义的静态值
  • 通过实施 Claim Information Provider SPI 的任何其他源

将声明推送到红帽 Keycloak 服务器构建时,策略不仅可以基于用户是谁,还可以考虑上下文和内容,具体根据谁、原因、何时、位置以及给定交易而考虑。它是基于上下文的授权,以及如何使用运行时信息来支持精细的授权决策。

9.2.1. 从 HTTP 请求获取信息

以下是如何从 HTTP 请求中提取声明的几个示例:

keycloak.json

{
  "paths": [
    {
      "path": "/protected/resource",
      "claim-information-point": {
        "claims": {
          "claim-from-request-parameter": "{request.parameter['a']}",
          "claim-from-header": "{request.header['b']}",
          "claim-from-cookie": "{request.cookie['c']}",
          "claim-from-remoteAddr": "{request.remoteAddr}",
          "claim-from-method": "{request.method}",
          "claim-from-uri": "{request.uri}",
          "claim-from-relativePath": "{request.relativePath}",
          "claim-from-secure": "{request.secure}",
          "claim-from-json-body-object": "{request.body['/a/b/c']}",
          "claim-from-json-body-array": "{request.body['/d/1']}",
          "claim-from-body": "{request.body}",
          "claim-from-static-value": "static value",
          "claim-from-multiple-static-value": ["static", "value"],
          "param-replace-multiple-placeholder": "Test {keycloak.access_token['/custom_claim/0']} and {request.parameter['a']}"
        }
      }
    }
  ]
}
Copy to Clipboard Toggle word wrap

9.2.2. 从外部 HTTP 服务获取信息

以下是如何从外部 HTTP 服务提取声明的几个示例:

keycloak.json

{
  "paths": [
    {
      "path": "/protected/resource",
      "claim-information-point": {
        "http": {
          "claims": {
            "claim-a": "/a",
            "claim-d": "/d",
            "claim-d0": "/d/0",
            "claim-d-all": [
              "/d/0",
              "/d/1"
            ]
          },
          "url": "http://mycompany/claim-provider",
          "method": "POST",
          "headers": {
            "Content-Type": "application/x-www-form-urlencoded",
            "header-b": [
              "header-b-value1",
              "header-b-value2"
            ],
            "Authorization": "Bearer {keycloak.access_token}"
          },
          "parameters": {
            "param-a": [
              "param-a-value1",
              "param-a-value2"
            ],
            "param-subject": "{keycloak.access_token['/sub']}",
            "param-user-name": "{keycloak.access_token['/preferred_username']}",
            "param-other-claims": "{keycloak.access_token['/custom_claim']}"
          }
        }
      }
    }
  ]
}
Copy to Clipboard Toggle word wrap

9.2.3. 静态声明

keycloak.json

{
  "paths": [
    {
      "path": "/protected/resource",
      "claim-information-point": {
        "claims": {
          "claim-from-static-value": "static value",
          "claim-from-multiple-static-value": ["static", "value"]
        }
      }
    }
  ]
}
Copy to Clipboard Toggle word wrap

9.2.4. 声明信息供应商 SPI

当没有内置供应商足以满足其要求时,开发人员可以使用 Claim Information Provider SPI 来支持不同的声明信息点。

例如,要实施一个新的 CIP 供应商,您需要在应用程序的 classpath 中实施 org.keycloak.adapters.authorization.ClaimInformationPointProviderFactoryClaimInformationPointProvider,并提供文件 META-INF/services/org.keycloak.adapters.authorization.ClaimInformationPointProviderFactory

org.keycloak.adapters.authorization.ClaimInformationPointProviderFactory 示例:

public class MyClaimInformationPointProviderFactory implements ClaimInformationPointProviderFactory<MyClaimInformationPointProvider> {

    @Override
    public String getName() {
        return "my-claims";
    }

    @Override
    public void init(PolicyEnforcer policyEnforcer) {

    }

    @Override
    public MyClaimInformationPointProvider create(Map<String, Object> config) {
        return new MyClaimInformationPointProvider(config);
    }
}
Copy to Clipboard Toggle word wrap

每个 CIP 供应商都必须与名称关联,如 MyClaimInformationPointProviderFactory.getName 方法中所述。名称将用于将 policy-enforcer 配置中的 claim-information-point 部分中的配置映射到实施。

在处理请求时,策略 enforcer 将调用 MyClaimInformationPointProviderFactory.create 方法,以获取 MyClaimInformationPointProvider 实例。在调用时,为这个特定 CIP 供应商(通过 claim-information-point)定义的任何配置都作为映射传递。

ClaimInformationPointProvider 示例:

public class MyClaimInformationPointProvider implements ClaimInformationPointProvider {

    private final Map<String, Object> config;

    public MyClaimInformationPointProvider(Map<String, Object> config) {
        this.config = config;
    }

    @Override
    public Map<String, List<String>> resolve(HttpFacade httpFacade) {
        Map<String, List<String>> claims = new HashMap<>();

        // put whatever claim you want into the map

        return claims;
    }
}
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat