负载均衡、Spring Security、ConcurrentSessionFilter

Dan*_*tes 5 networking spring

我有一个 Spring 2.5.6/Flex 应用程序设置并运行 Spring Security 2.0.4。最近一个负载平衡器(A Foundry ServerIron 4g http://www.foundrynet.com/products/a...ems/si-4g.html)已经到位,现在我遇到了跨域错误。基本上,负载平衡器向 myloadbalancer.abc.com 发出请求,而 myrealserver1.abc.com 作为域名返回。Spring Security 以某种方式将请求转发到真实服务器。我怎样才能解决这个问题?

ConcurrentSessionFilter 也不再工作。应用程序设置为禁用并发登录,但在应用程序置于负载平衡器之后后,此功能停止。我相信也有多个 Oracle 应用服务器集群在一起。我以前从未处理过集群或负载平衡器,我不知道软件在某些领域必须以不同的方式编写。

这些对我来说听起来像是不同的问题,但我需要两者的帮助。

Nil*_*oka 3

关于你的第二个问题:

如果 ConcurrentSessionFilter 停止工作(即不再阻止并发会话),这可能是由于具有粘性会话的集群应用程序容器造成的。

在这样的设置中,集群的每个节点独立工作,不与其他节点共享状态。相反,负载均衡器确保现有会话始终由同一节点提供服务。

现在,Spring Security 的ConcurrentSessionController工作原理是将会话映射到主体。控制器本身依赖于用户会话启动和终止时的HttpSessionEventPublisher发送 。ApplicationEvents

如果打算打开多个会话的人最终在他已经打开了一个会话的同一节点上,那么一切都会正常工作。HttpSessionEventPublisher通知并发会话机制会话的创建,并且身份验证将失败,因为已经存在与该用户关联的会话。然而,在不同的节点上,该用户还没有会话,因此ConcurrentSessionController不会抱怨并且登录成功。

幸运的是,解决问题应该很容易:实现您自己的SessionRegistry并为所有节点使用共享数据存储(例如应用程序的数据库)。