首页 > 解决方案 > Spring OAuth2 客户端多租户

问题描述

有一个带有 N 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. 将获得其他授权:

现在的问题是,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 令牌——这不是我现阶段的情况。

标签: springspring-bootoauth-2.0openid-connect

解决方案


推荐阅读