Spring OAuth2 客户端多租户

时间:2021-03-16 12:54:38

标签: spring spring-boot oauth-2.0 openid-connect

有一个没有 oauth 客户端配置的 Spring Boot 应用程序:

spring.security.oauth2.client.registration.number1.client-id = ....
spring.security.oauth2.client.registration.number1.scope = openid,...
....

spring.security.oauth2.client.registration.number2
...

spring.security.oauth2.client.registration.numberN
...

我相信可以配置下一个场景:

  1. 假设\标记一些注册(让它成为第一个)为主要注册。 身份验证只能通过此注册来实现(同时接收 id_token 和 access_token)
  2. 将获得其他授权
  • 按需 - 通过已知请求参数路由
  • 在某些条件下立即 - 假设我们在根页面“/”(单页面应用程序)上,然后循环浏览所有注册以获取所有 access_token。是的,用户将被重定向到不同的 IdP N 次。

现在的问题是 SecurityContextHolder 会在任何客户端注册流程完成后立即填充新的主体,覆盖先前的值。 我在需要的地方使用了类似的代码片段:

        Authentication principal = SecurityContextHolder.getContext().getAuthentication(); // can be spoiled
        if (principal == null) {
            principal = ANONYMOUS_AUTHENTICATION;
        }
        OAuth2AuthorizeRequest authRequest = OAuth2AuthorizeRequest.withClientRegistrationId(primaryRegId)
                .principal(principal)
                .attribute(HttpServletRequest.class.getName(), servletRequest)
                .attribute(HttpServletResponse.class.getName(), servletResponse)
                .build();
        oAuth2AuthClientManager.authorize(authRequest); 

我该如何解决这个问题? 是否有可能命令 Spring 不重置身份验证而只获取 access_token?

我找到了一些关于多租户的信息,但它是关于资源服务器端的 - 根据其声明验证 jwt 令牌 - 而这不是我现阶段的情况。

0 个答案:

没有答案