Java 使用spring security与2台生产服务器进行Web应用程序用户身份验证

Java 使用spring security与2台生产服务器进行Web应用程序用户身份验证,java,authentication,spring-security,security,Java,Authentication,Spring Security,Security,在基于java的web应用程序的服务器端工作将为移动和web客户端服务,我需要实现用户身份验证。在生产中,我复制了两台服务器,使用负载平衡器在同一个DB上工作。我以前使用过Spring security,所以这对我来说是最直观的方式,但我的问题是: 当用户登录时,Spring security会针对DB对用户进行一次身份验证,之后的请求会使用基于会话的令牌进行处理和身份验证。现在,假设我的一台生产服务器停机,那么我将失去会话,这意味着用户将得到某种未经授权的响应。我该怎么处理 我想到了三个选择

在基于java的web应用程序的服务器端工作将为移动和web客户端服务,我需要实现用户身份验证。在生产中,我复制了两台服务器,使用负载平衡器在同一个DB上工作。我以前使用过Spring security,所以这对我来说是最直观的方式,但我的问题是:

当用户登录时,Spring security会针对DB对用户进行一次身份验证,之后的请求会使用基于会话的令牌进行处理和身份验证。现在,假设我的一台生产服务器停机,那么我将失去会话,这意味着用户将得到某种未经授权的响应。我该怎么处理

我想到了三个选择

使用键值存储,例如,并将我的令牌保存在那里。如果我这样做,我想我必须干扰spring的核心代码——一次是在用户登录时,将令牌保存到键值存储中;一次是在验证用户时,根据该键值存储而不是spring的内存HttpSessionSecurityContextRepository进行验证。 使用Spring安全性的方式是,它在每个请求中根据DB对用户进行身份验证,我甚至不确定这是否可行。 不使用spring安全性,只需创建一个或一些过滤器,就可以针对DB对每个请求进行身份验证。这意味着两件事:第一件事是我的客户机必须对每个请求应用用户名和密码,可能是在头中,第二件事是我必须为每个请求查询数据库。
因此,这些是我的想法,我想让您了解这些想法和新建议(如果有的话)。

用户在整个会话中保持的状态如何? 如果出现这种情况,那么如果服务器出现故障,您将丢失数据

我认为最好从这里的粘性会话机制开始,保持身份验证不变

粘性会话可以在负载平衡器上配置,通常意味着:

一旦使用IP A打开服务器S1上的应用程序,所有后续请求都将重定向到此服务器,但下一个用户将自动连接到服务器S2负载平衡器将做出这样的决定。总之,如果您有10个用户同时工作,其中5个将连接到服务器S1,其余的连接到服务器B。 我不认为对每个请求进行身份验证是一个好主意,想想web 2、ajax请求——这会使服务器和数据库负载过高,因此它无法同时处理大量用户/请求


希望这有帮助

用户没有会话信息,会话的唯一用途是进行身份验证。我不熟悉粘性会话机制,但根据您的解释,它无法解决我的问题,因为一旦其中一台服务器停机,登录到它的用户将被踢出,并将不得不重新登录。是的,这并不能提供高可用性的解决方案,但允许实现负载平衡。如果你的应用程序是无状态的,你可以考虑使用Tomcat支持的会话复制:例如,OK,我会检查一下我使用的是Tomcat…1很好,你只需要创建你自己的自定义触发器并插入它。嗨,Yogev lidor,你解决了这个问题吗?如果是的话,你能给我们提供同样的细节吗。