使用Spring安全性的2个生产服务器的Web应用程序用户认

时间:2012-09-20 05:02:06

标签: java authentication spring-security security

在基于Java的Web应用程序的服务器端工作(将为移动和Web客户端提供服务),我需要实现用户身份验证。在生产中,我有2台服务器(重复,使用相同的数据库)和负载均衡器。之前我使用过Spring安全性,所以这对我来说是最直观的方式,但这是我的问题:

Spring安全性一次针对数据库(当用户登录时)对用户进行身份验证,并使用基于会话的令牌处理和验证以后的请求。现在,假设我的一个生产服务器已关闭,那么我正在失去我的会话,这意味着用户将获得某种“未经授权”的响应。我怎么处理这个?

我想到了3个选项

  1. 使用redis等键值存储,并将令牌保存在那里。如果我这样做,我想我必须干涉spring核心代码 - 一旦用户登录(将令牌保存到键值存储),一次用于验证用户(对此键值存储进行身份验证而不是spring-内存HttpSessionSecurityContextRepository)。
  2. 使用Spring安全性的方式是在每个请求中针对数据库对用户进行身份验证(我不确定它是否可行)。
  3. 不使用spring安全性,只需创建一个过滤器或一些interceptor,以便针对数据库验证每个请求。这意味着两件事:第一,我的客户必须为每个请求(可能在标题中)应用用户名和密码,其次是我必须向每个请求查询数据库。
  4. 所以这些是我的想法,如果你有,我想了解你的见解和新建议。

1 个答案:

答案 0 :(得分:0)

用户在会话中维护的状态如何? 如果您遇到这种情况,那么如果服务器发生故障,您将丢失数据。

我认为最好的方法是从粘性会话机制开始,然后保持身份验证。

可以在负载均衡器上配置Sticky会话,通常表示以下内容:   - 一旦IP A的使用在服务器S1上打开您的应用程序,所有后续请求将被重定向到该服务器,但下一个用户将自动连接到服务器S2(负载均衡器将做出这样的决定)。总而言之,如果您有10个用户同时工作,其中5个将连接到服务器S1,其余用户连接到服务器B.

我不认为验证每个请求是一个好主意(想想web 2,ajax请求) - 这将使您的服务器和数据库高度加载,因此它将无法处理大量的用户/请求同时。

希望这有帮助

相关问题