1

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

Spring security 对 DB 进行一次用户身份验证(当用户登录时),然后使用基于会话的令牌处理和验证以后的请求。现在,假设我的一个生产服务器关闭了,然后我失去了我的会话,这意味着用户将得到某种“未经授权”的响应。我该如何处理?

我想到了3个选项

  1. 使用诸如redis之类的键值对存储并将我的令牌保存在那里。如果我这样做,我想我必须干扰 springs 核心代码 - 一次是在用户登录时(将令牌保存到键值存储),一次是在验证用户时(验证这个键值存储而不是 spring 的 in-内存 HttpSessionSecurityContextRepository)。
  2. 以一种在每个请求中针对数据库对用户进行身份验证的方式使用 Spring 安全性(我不确定它是否可能)。
  3. 不使用spring security,而是简单地创建一个过滤器或一些拦截器,以便对数据库的每个请求进行身份验证。这意味着两件事:第一件事是我的客户必须将用户名和密码应用于每个请求(可能在标头中),第二件事是我必须为每个请求查询数据库。

所以这些是我的想法,如果你有这些想法和新建议,我想听听你的见解。

4

1 回答 1

0

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

我认为最好的方法是从此处的粘性会话机制开始,并保持身份验证不变。

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

  • 一旦来自 IP A 的使用在服务器 S1 上打开您的应用程序,所有后续请求将被重定向到该服务器,但下一个用户将自动连接到服务器 S2(负载平衡器将做出这样的决定)。所以总而言之,如果你有 10 个用户同时工作,其中 5 个将连接到服务器 S1,其余的连接到服务器 B。

我不认为对每个请求进行身份验证是一个好主意(想想 web 2、ajax 请求)——这会使你的服务器和数据库负载很高,因此它无法处理很多用户/请求同时。

希望这可以帮助

于 2012-09-20T05:40:51.567 回答