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

Spring Security性在负载平衡(AWS Beanstalk)环境中失败?

岳浩宕
2023-03-14

我正在处理一个在现有环境中工作得很好的现有代码。该应用程序有一个登录表单,将用户带到登陆页面后,他们登录。

<security:http use-expressions="true">
    <security:intercept-url pattern="/" access="permitAll" />
    <security:intercept-url pattern="/index.html" access="permitAll" />
    <security:intercept-url pattern="/login.html" access="permitAll" />

    ... bunch of other pages ....

    <security:intercept-url pattern="/secure/**" access="isAuthenticated()" />


    <security:form-login login-page="/login.html"
        default-target-url="/secure/landing.html"
        authentication-failure-url="/login.html?login_error=1" />

    <security:logout logout-url="/logout.html"
        logout-success-url="/login.html" />
</security:http>

应用程序在单节点环境中运行良好,例如用户登录时的日志跟踪:

1:[http-bio-8080-exec-1 DEBUG defaultreDirectStrategy-sendredirect-重定向到'/myapp/secure/landing.html'

2:[http-bio-8080-exec-1]调试httpsessionsecuritycontextrepository-saveContext-securityContext存储到httpsession:'org.springframework.security.core.context.securityContextTimpl@86073c69:/*一些细节*/授予权限:role_user

3:[http-bio-8080-exec-1]当请求处理完成时,调试securityContextPersistenceFilter-doFilter-securityContextHolder现在被清除

4:[http-bio-8080-exec-1]调试AntPathRequestMatcher-matches-检查请求的匹配:'/secure/landing.html';针对'/resources/**'

当这个应用程序(我们使用了完全相同的war文件)进入AWS Beanstalk环境(配置了2个实例)时,会发生以下情况:

2:[http-bio-8080-exec-7]调试httpsessionSecurityContextRepository-CreateNewSessionIfAllow-HttpSession创建为SecurityContext是非默认的

3:[http-bio-8080-exec-7]调试httpsessionsecuritycontextrepository-saveContext-securityContext存储到httpsession:'org.springframework.security.core.context.securityContextTimpl@a3421210:/*一些细节*/授予权限:role_user

4:[http-bio-8080-exec-7]当请求处理完成时,调试securityContextPersistenceFilter-doFilter-securityContextHolder现在被清除

5:[http-bio-8080-exec-9]调试AntPathRequestMatcher-matches-检查请求的匹配:“/login.html”;针对'/resources/**'

逐行比较:

  • AWS日志有1个额外的行,第2行
  • AWS日志在最后一行(第5行)中显示了线程从exec-7到exec-9的变化(因此丢失了原始请求重定向,并将其替换回/login.html而不是/secure/landing.html)

为了解决AWS中的问题,将beanstalk重新配置为只处理1个实例似乎隐藏了这个问题。

知道在多节点环境中失败的配置缺少什么吗?

共有1个答案

戴品
2023-03-14

当使用负载平衡器时,您必须记住,每个请求最终都可能出现在不同的实例上。在这种情况下,服务器1上存储的任何信息都不能用于服务器2。在用户身份验证的情况下,有几种方法可以解决这个问题:

  • 使用第三方维护身份验证信息。
  • 使用粘滞会话-配置负载均衡器以在http会话期间始终转发到一台服务器
 类似资料:
  • 我有两条溪流。一个是事件流,另一个是数据库更新流。我想用从DB更新流构建的信息丰富事件流。 事件流非常庞大,使用5个字段进行分区。这给了我很好的分配。DB流不那么喋喋不休,并且使用两个字段进行分区。我目前正在使用两个公共字段连接这两个流,并使用flapMap来丰富第一个流。flatMap运算符使用ValueState维护状态,状态由两个公共字段自动键入。 除了实现自定义逻辑来手动提取键并更新维护状

  • 我是微服务的新手。(学习阶段)。我有一个问题。我们在云中部署微服务。(例如 AWS)。云已经提供了负载平衡和日志。我们还在Spring Boot中实现了负载平衡(功能区)和日志(Rabbit MQ和Zipkin)。这两种实现有什么区别?我们两者都需要吗?有些人可以回答这些问题吗? 提前感谢。

  • web-service预期会有很多调用,而我希望在出现故障时使该服务成为冗余,因此我希望有两个实例同时运行以处理所有请求。 1)让两个级别的Web服务同时处理请求的最佳方法是什么?使用外部负载均衡器还是使用AKKA/AKKA-HTTP中的某种魔法(我不知道)? 2)我必须调整哪些主要参数来提高性能?

  • 我们面临着 ActiveMQ - M 集合负载平衡的几个问题。有人可以帮忙吗?以下是我们的设置 MCO在故障转移池-Broker1中配置了两个ActiveMQ代理 经纪人1 问题1:MCO客户端在broker1和broker2之间的负载平衡和连接不相等。700 MCO连接到broker1,而只有100 MCO连接至broker2。我们是否缺少此负载平衡的任何属性? 问题 2: 当我们添加新的代理(

  • 我用JMeter创建了测试来测试幽灵博客平台的性能。Ghost是用Node.js编写的,安装在云服务器上,有1GB的内存和1个CPU。 我注意到在400个并发用户之后JMeter得到错误。到400个并发用户的负载是正常的。我决定增加CPU,增加了1个CPU。 但是错误重现并添加了2个CPU,总共4个CPU。问题发生在400个并发用户之后。 我想知道是否有可能平衡CPU之间的负载?

  • Camel 是大众点评开发的软负载一体解决方案,承担了F5四层硬负载后的软负载工作。Camel已成为大众点评网络流量中必不可缺的一层。