spring - 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
...
我相信可以配置下一个场景:
- 假设\标记一些注册(让它成为第一个)作为主要注册。只能通过此注册来实现身份验证(同时接收 id_token 和 access_token)
- 将获得其他授权:
- 按需 - 通过已知请求参数的路由
- 在某些条件下立即 - 假设我们在根页面“/”(单页应用程序)上,然后循环所有注册以获取所有 access_tokens。是的,用户将被重定向到不同的 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 令牌——这不是我现阶段的情况。
解决方案
推荐阅读
- python - Python subprocess.call 与 python shell 的运行方式不同
- angular - 将值传递给 API 时的日期时间问题
- python - Python - tkinter 在函数处理期间显示进度条
- c++ - 如何使用 ifstream 以十进制模式打开文件
- linux - Shellscript 未在 crontab 中运行以执行 sqlcmd
- laravel - 从 swagger API 发送标头
- javascript - 如何从下拉列表中显示选定的值
- iis - 使用 n 个查询字符串重写 IIS
- python - Python中的函数求和
- javascript - 尝试使用 Angular 代理请求时发生错误