Spring Security Spring安全性/密钥伪装:保护具有多个领域的相同请求路径

xriantvc  于 2022-11-24  发布在  Spring
关注(0)|答案(2)|浏览(159)

我希望两个不同领域中的用户(例如人类用户和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的多个领域的逻辑方式,但我愿意接受实现这一点的建议。

wooyq4lh

wooyq4lh1#

由于Keycloak提供了OAuth2功能,因此您不一定需要使用keycloak适配器(许多适配器正因此而被弃用,甚至请参见here),相反,您可以只依赖Spring Security的内置功能。
如何为具有多个颁发者的Spring Security配置JWT身份验证的示例如下所示:

JwtIssuerAuthenticationManagerResolver authenticationManagerResolver = new JwtIssuerAuthenticationManagerResolver
    ("https://idp.example.org/issuerOne", "https://idp.example.org/issuerTwo");

http
    .authorizeHttpRequests(authorize -> authorize
        .anyRequest().authenticated()
    )
    .oauth2ResourceServer(oauth2 -> oauth2
        .authenticationManagerResolver(authenticationManagerResolver)
    );

在您的情况下,单独的发行者URL将是您各自领域的发行者URL。此示例直接取自Spring Security文档,它还包含如何使用XML配置实现相同功能的示例(如果您喜欢使用XML配置)。
当然,如果您已经在使用适配器,那么从适配器中迁移出来可能并不容易,但是由于适配器无论如何都将在长期内消失,因此尽早进行评估可能是值得的

r7xajy2e

r7xajy2e2#

Keycloak适配器的弃用声明为there
你应该看看我写的this OpenID adapter,它可以根据你的需要与任意数量的发行者一起工作,并解决了相当多的keycloakSpring引导适配器限制:

  • 与webmvc(servlet)和webflux(React式)应用程序兼容
  • Spring Boot 3就绪(不扩展WebSecurityConfigurerAdapter)
  • 不遵守Keycloak(可与任何OpenID授权服务器配合使用)
  • 安全单元测试工具

基本教程here

相关问题