9.2.4. 声明信息提供程序 SPI
如果任何内置供应商都足够满足要求,则开发人员可使用 Claim Information Provider SPI 来支持不同的声明信息点。
例如,要实施新的 CIP 提供程序,您需要实施 org.keycloak.adapters.authorization.ClaimInformationPointProvidery 和 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 方法所定义。name 将用于从 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 ClaimsInformationPointProvider(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;
}
}