15.2. 声明信息点
申索信息点(CIP)负责解析声明并将这些声明推送到红帽构建的 Keycloak 服务器,以提供有关策略访问上下文的更多信息。它们可以定义为 policy-enforcer 的配置选项,以便解析来自不同源的声明,例如:
- HTTP 请求(参数、标头、正文等)
- 外部 HTTP 服务
- 配置中定义的静态值
- 通过实施 Claim Information Provider SPI 来任何其他源
当将声明推送到红帽构建的 Keycloak 服务器时,策略不仅可以考虑用户是谁,还可以根据具体情况、何时、何时以及给定事务使用上下文和内容来考虑基础决策。它都是基于上下文的授权以及如何使用运行时信息,以支持细粒度授权决策。
15.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']}"
}
}
}
]
}
15.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']}"
}
}
}
}
]
}
15.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"]
}
}
}
]
}
15.2.4. 声明信息提供商 SPI 复制链接链接已复制到粘贴板!
开发人员可以使用 Claim Information Provider SPI 来支持不同的声明信息点(如果内置的供应商都不够)来满足自己的要求。
例如,要实施新的 CIP 提供程序,您需要在应用程序的 classpath 中实施 org.keycloak.adapters.authorization.ClaimInformationPointProviderFactory 和 ClaimInformationPointProvider,并提供文件 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);
}
}
每个 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;
}
}