当前位置: 首页 > 知识库问答 >
问题:

负载平衡器后面的SpringOAuth2 SSO

百里俭
2023-03-14

我有一个非常简单的Spring Boot应用程序,具有社交单点登录功能。

看起来是这样的:

@Configuration
@EnableOAuth2Sso
class Application {
  // beans
}

它在应用程序中有必需的条目。yml:

security:
  oauth2:
    client:
      # clientId: ...
      # clientSecret: ...
      accessTokenUri: https://www.googleapis.com/oauth2/v3/token
      userAuthorizationUri: https://accounts.google.com/o/oauth2/auth
      tokenName: oauth_token
      authenticationScheme: query
      clientAuthenticationScheme: form
      scope: email
    resource:
      userInfoUri: https://www.googleapis.com/userinfo/v2/me
      preferTokenInfo: false

它在我的本地机器上运行得很好,并且只启动了一个实例。

当有多个实例隐藏在负载平衡器后面时,就会出现问题。

即使用户在第一个请求中进行身份验证,向负载均衡器发出的后续请求也会因401而被阻止。

与第一个应用程序实例相比,请求被路由到不同的应用程序实例。

我正在试图弄清楚,如何使用JWT或JDBC使其无状态,以便它跨多个实例工作。不幸的是,我在网上没有找到任何有效的例子。

其中有些需要启动授权服务器。但这不是我的情况,因为我想将授权完全转发给第三方提供商(如谷歌)。

在这种情况下,我应该怎么做才能使授权跨多个实例工作?

共有1个答案

郁明诚
2023-03-14

Spring仅在cookie中存储会话的ID,但数据位于Web服务器上的某个位置(tomcat?)并由此id获取。当您的请求击中其他tomcat实例时,它无法将id连接到数据。您可以做的是查看使用redis而不是特定实例文件系统的Spring会话项目。

另一种方法是在LB上使用粘性会话,我不建议这样做,但可能适合您的解决方案。LB会小心地将用户请求一次又一次地传递给同一服务器。当然,这不是安全的解决方案,因为当Web服务器死亡时,您的用户将丢失会话/从应用程序注销。

 类似资料:
  • 这意味着Zookeeper将负载均衡器理解为一个客户机,并与之建立联系。但是负载均衡器只是ping TCP2181就出来了。

  • 我已经按照用户指南在库伯内特斯上实现了Traefik。这给了我一个入口控制器,我能够在80和8080上创建一个入口和traefik-ingress-service监听。 我还设置了“gce”入口: 这样做的目的是创建一个GCE负载平衡器,它终止我的TLS,并将所有请求转发给NodePort类型的traefik入口服务。 GCE负载平衡器需要进行健康检查。默认为路径“/”。我以为traefik有个“

  • 我有一个在AWS上运行的项目。结构如下: 我已使用AWS证书管理器为负载平衡器创建了一个证书。所以现在的流量是: 但由于加载网页时实例上没有证书,因此会收到“站点不安全”警告。 如何创建从客户端到负载均衡器后面的任何实例的完整SSL连接? 编辑 以下是nginx配置(适用于所有实例)

  • 我有两条溪流。一个是事件流,另一个是数据库更新流。我想用从DB更新流构建的信息丰富事件流。 事件流非常庞大,使用5个字段进行分区。这给了我很好的分配。DB流不那么喋喋不休,并且使用两个字段进行分区。我目前正在使用两个公共字段连接这两个流,并使用flapMap来丰富第一个流。flatMap运算符使用ValueState维护状态,状态由两个公共字段自动键入。 除了实现自定义逻辑来手动提取键并更新维护状

  • 我有一个Wordpress网站在AWS EC2实例上运行。这是通过AWS弹性负载平衡器提供的,它使用我从Amazon获得的证书启用了HTTPS。 其目的是为该网站提供http和https版本。加载http版本可以正常工作。 然而,当我加载https版本时,会出现混合内容错误,因为总是返回http链接。负载平衡器的工作方式是TLS终止于LB,并通过端口80与实际EC2实例通信。因此,实例本身上没有H

  • 试图自学如何使用库伯内特斯,但有一些问题。 我的下一步是尝试使用LoadBalancer类型的服务来访问nginx。 我建立了一个新的集群并部署了nginx映像。 然后,我为LoadBalancer设置服务 设置完成后,我尝试使用LoadBalancer入口(我在描述LoadBalancer服务时发现)访问nginx。我收到一个此页面无法工作的错误。 不太确定我哪里出错了。 kubectl获得sv