服务器之间的会话共享(群集)的Spring会话

时间:2018-01-17 03:53:07

标签: spring spring-security spring-session

我正在尝试让两台具有相同基本域(子域不同)的计算机共享会话。

spring-session-jdbc似乎是我可以用来实现目标的解决方案。

当用户登录server-a时,会话信息存储在SPRING_SESSION数据库中 令我担心的是,自定义org.springframework.security.core.userdetails.UserDetails类也存储在该数据库中。

server-b尝试从db读取会话数据时,它必须使用org.springframework.security.core.userdetails.UserDetails的相同自定义子类。

所以我正在复制与UserDetails类相关的代码server-aserver-b

我觉得这样做有点尴尬,因为server-aserver-b一般可能需要不同的UserDetails

这是否真的是使用spring-session-jdbc的方式?

另一个问题是,spring-securityserver-a是否必须使用server-b

2 个答案:

答案 0 :(得分:1)

Spring Session旨在轻松启用会话群集,即让同一个应用的多个实例共享外部会话存储,从而更轻松地扩展您的应用。

对于您尝试解决的问题,最好使用适当的更高级别协议,例如OAuth 2.0和OpenID Connect,并实现单点登录,而无需通过会话存储耦合应用程序。

虽然最初在不同应用程序之间共享会话存储的想法看起来很方便,但这种安排通常很成问题,正如您在UserDetails示例中所说的那样。

答案 1 :(得分:0)

Vedran Pavic's answer一致,听起来您应该使用sso。也就是说,在某些情况下,例如在微服务集群中,不同的代码库可能希望共享同一会话。在这种情况下,您应该简单地将UserDetails放入其他jar /模块所依赖的基本jar /模块中。您可以使用构建自动化工具来简化打包过程。

要回答您的最后一个问题,如果这两个应用程序定期相互通信,那么我建议您在任何地方都可以使用Spring Security,或者在任何地方都可以使用。