当前位置: 首页 > 知识库问答 >
问题:

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

吕扬
2023-03-14

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

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

我想到了3个选择

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

因此,这些是我的想法,我想得到你的见解和新的建议,如果你有。

共有1个答案

丌官淇
2023-03-14

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

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

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

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

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

希望这有帮助

 类似资料:
  • react中的前端 基于Spring Boot“resource-service”的后端服务 keycloak 其他后端服务(使用者) 前端和使用者服务都使用REST API与后端通信。我们使用Keycloak作为我们的用户管理和身份验证服务。 我们希望通过提供web应用程序和服务流来将基于Spring的服务“资源服务”与Keycloak集成: > 基于web application-react的

  • 我已经浏览了很多帖子和文章,但没有找到一个简单的解决方案,下面我必须实现。 平台:Spring Boot 2。x、 嵌入Tomcat的x(Spring Security 5.x.x) 解决方案:使用许多客户端应用程序和许多最终用户的REST服务。 > 因此,我必须使用一次性令牌对上述应用程序进行身份验证。因此,我计划通过启用和来实现Spring OAuth2。对于每个应用程序客户端,我将生成一个令

  • 我需要在我的上连接谷歌日历。NET 4.5应用程序(VS 2013项目)。我想从日历中获取所有信息,例如:事件、日期、笔记、姓名、客人等。。。 我使用Google开发者控制台创建了一个Web应用程序客户端ID和一个服务帐户,但我得到了不同的错误,没有结果。我实现了两种不同的方法,一种是使用Web应用程序客户端ID登录,另一种是使用服务帐户。 这是常见的ASPX页面 使用Web应用程序客户端ID 我

  • 我的webapp是用。NET核心并部署在Azure中。我已启用Azure应用程序服务身份验证,并将其配置为使用Azure Active Directory。当我访问webapp时,我确实会被重定向到正确的登录页面。登录后,我可以浏览到endpoint。对我进行身份验证,并查看是否存在针对我的用户的声明。我还可以验证下面的请求标头是否存在值: X-MS-TOKEN-AAD-ID-TOKEN X-MS

  • 问题内容: 简短的问题: 我在.NET中有一个Web API服务,而一个站点仅由HTML和AngularJS组成。 如何仅对我的网站授权给我的服务? 我正在寻找一个似乎很常见但不是常见问题的安全答案。在最近的日子里,我读了很多答案,想法和各种各样的东西,但是找不到解决方案。 假设我有一个来自MS的Web Api服务(最新的)。所以我必须要消耗它的应用程序。让我们定义两个方案。 方案1: 在同一个I

  • GoogleCredential凭证=newGoogleCredential.Builder(). setTransfer(TRANSPORT). setJsonFactory(JSON_FACTORY). setServiceAccount tId("SOMETHING@developer.gserviceaccount.com"). setServiceAccount tScopes(Bigq