我希望两个不同领域中的用户(例如人类用户和S2S用户)访问同一个rest端点。我能找到的所有多租户示例(例如keycloak多租户文档)都建议实现一个KeycloakConfigResolver
,以便根据请求路径选择单个领域。例如:
public class PathBasedKeycloakConfigResolver implements KeycloakConfigResolver {
private final KeycloakDeployment realm1Deployment;
private final KeycloakDeployment realm2Deployment;
public PathBasedKeycloakConfigResolver() throws IOException {
realm1Deployment = buildDeployment("realm1.json");
realm2Deployment = buildDeployment("realm2.json");
}
@Override
public KeycloakDeployment resolve(HttpFacade.Request request) {
String path = request.getRelativePath();
return path.startsWith("clients/") ? realm1Deployment : realm2Deployment;
}
private static KeycloakDeployment buildDeployment(String path) throws IOException {
return KeycloakDeploymentBuilder.build(new ClasspathResource(path).getInputStream());
}
}
但这要求我为每个请求路径选择一个域。
我想要不同的功能,我想尝试对多个领域验证请求,并选择第一个成功的。我觉得这是支持单个URI的多个领域的逻辑方式,但我愿意接受实现这一点的建议。
2条答案
按热度按时间wooyq4lh1#
由于Keycloak提供了OAuth2功能,因此您不一定需要使用keycloak适配器(许多适配器正因此而被弃用,甚至请参见here),相反,您可以只依赖Spring Security的内置功能。
如何为具有多个颁发者的Spring Security配置JWT身份验证的示例如下所示:
在您的情况下,单独的发行者URL将是您各自领域的发行者URL。此示例直接取自Spring Security文档,它还包含如何使用XML配置实现相同功能的示例(如果您喜欢使用XML配置)。
当然,如果您已经在使用适配器,那么从适配器中迁移出来可能并不容易,但是由于适配器无论如何都将在长期内消失,因此尽早进行评估可能是值得的
r7xajy2e2#
Keycloak适配器的弃用声明为there。
你应该看看我写的this OpenID adapter,它可以根据你的需要与任意数量的发行者一起工作,并解决了相当多的keycloakSpring引导适配器限制:
基本教程here。