我正在编写一个在现有环境中运行良好的现有代码。应用程序有一个登录表单,在用户登录后将用户带到登陆页面。
我的问题是:当我将应用程序移动到AWS Bean秸秆(有2个实例)时,成功的登录会将用户带回到登录页面
该应用程序是基于Spring的(MVC,Security),具有以下安全配置:
<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除错DefaultRedirectStrategy - sendRedirect -重定向到'/myapp/secure/landing.html‘ 'org.springframework.security.core.context.SecurityContextImpl@86073c69: 2: http-bio-8080-exec-1除错HttpSessionSecurityContextRepository - saveContext - SecurityContext存储到HttpSession: /*一些详细信息*/授予权限: ROLE_USER‘ 3: http-bio-8080-exec-1除错SecurityContextPersistenceFilter - doFilter - SecurityContextHolder已清除,请求处理完成。 4: http-bio-8080-exec-1除错AntPathRequestMatcher -匹配-检查请求的匹配:‘//landing.html’;针对'/resources/**‘
当这个应用程序(我们获取了完全相同的war文件)进入AWS Bean秸秆环境,配置了2个实例时,就会发生这样的情况:
1: http-bio-8080-exec-7调试DefaultRedirectStrategy - sendRedirect -重定向到'/secure/landing.html‘ 2: http-bio-8080-exec-7调试HttpSessionSecurityContextRepository - createNewSessionIfAllowed - HttpSession是非默认的。 'org.springframework.security.core.context.SecurityContextImpl@a3421210: 3: http-bio-8080-exec-7除错HttpSessionSecurityContextRepository - saveContext - SecurityContext存储到HttpSession: /*一些详细信息*/授予权限: ROLE_USER‘ 4: http-bio-8080-exec-7除错SecurityContextPersistenceFilter - doFilter - SecurityContextHolder已清除,请求处理完成。 5: http-bio-8080-exec-9调试AntPathRequestMatcher -匹配-检查请求的匹配:'/login.html';针对'/resources/**‘
逐行比较:
为了解决AWS中正在发生的问题,重新配置豆茎只使用1个实例似乎可以将问题隐藏起来。
知道在多节点环境中失败的配置缺少什么吗?
发布于 2014-08-06 14:54:09
在使用负载均衡器时,您必须记住,每个请求都可能以不同的实例结束。在这种情况下,服务器1上存储的任何信息都将无法用于服务器2。在进行用户身份验证时,有几种方法可以解决这个问题:
发布于 2014-11-21 21:07:02
根据春季安全文档,您需要确保使用非线程本地模式设置SecurityContextHolder bean。默认情况下,我认为它是使用MODE_THREADLOCAL设置的,它似乎不存在于弹性豆柄设置的线程系统中。
将strategyName = SecurityContextHolder.MODE_INHERITABLETHREADLOCAL或MODE_GLOBAL注入您的SecurityContextHolder bean,并让我知道它是否有效。
https://stackoverflow.com/questions/25162131
复制相似问题