我正在尝试让两台具有相同基本域(子域不同)的计算机共享会话。
spring-session-jdbc似乎是我可以用来实现目标的解决方案。
当用户登录server-a
时,会话信息存储在SPRING_SESSION数据库中
令我担心的是,自定义org.springframework.security.core.userdetails.UserDetails
类也存储在该数据库中。
当server-b
尝试从db读取会话数据时,它必须使用org.springframework.security.core.userdetails.UserDetails
的相同自定义子类。
所以我正在复制与UserDetails
类相关的代码server-a
到server-b
。
我觉得这样做有点尴尬,因为server-a
和server-b
一般可能需要不同的UserDetails
。
这是否真的是使用spring-session-jdbc
的方式?
另一个问题是,spring-security
和server-a
是否必须使用server-b
?
答案 0 :(得分:1)
Spring Session旨在轻松启用会话群集,即让同一个应用的多个实例共享外部会话存储,从而更轻松地扩展您的应用。
对于您尝试解决的问题,最好使用适当的更高级别协议,例如OAuth 2.0和OpenID Connect,并实现单点登录,而无需通过会话存储耦合应用程序。
虽然最初在不同应用程序之间共享会话存储的想法看起来很方便,但这种安排通常很成问题,正如您在UserDetails
示例中所说的那样。
答案 1 :(得分:0)
与Vedran Pavic's answer一致,听起来您应该使用sso。也就是说,在某些情况下,例如在微服务集群中,不同的代码库可能希望共享同一会话。在这种情况下,您应该简单地将UserDetails放入其他jar /模块所依赖的基本jar /模块中。您可以使用构建自动化工具来简化打包过程。
要回答您的最后一个问题,如果这两个应用程序定期相互通信,那么我建议您在任何地方都可以使用Spring Security,或者在任何地方都可以使用。