java - 在 maxInactiveInterval 之后,Jboss SSO 会话没有被破坏
问题描述
我们已经在 JBoss EPA 6.4.17 集群中成功配置了 SSO。
每个用户会话都配置了 1 分钟的maxInactiveInterval。因此客户端将继续每 30 秒向服务器发送一个活动请求以保持会话活动。我已经验证了手动注销时清除了 Jboss 缓存中的会话。同样,正确处理关闭选项卡和关闭浏览器操作。
如果我杀死浏览器进程或终止客户端与服务器的连接,预计会在 1 分钟后从服务器销毁缓存。因为会话的 maxInactiveInterval 是 1 分钟。但它并没有像预期的那样被破坏。
在调试。我发现了以下
- 一个 Jboss 线程继续运行以检查会话的有效性。即 ContainerBase.ContainerBackgroundProcessor
- 该线程将检查会话有效性。如果会话理想时间大于 maxInactiveInterval 它将使会话过期。
- 默认情况下,Jboss 会话maxEmptyLife为 30 分钟。但是我使用系统属性将其覆盖为 0 分钟。所以会话将立即被销毁。
- 手动注销和会话超时操作都在调用 session.invalidate();
- 然后代码控制到达 ClusteredSingleSignOn.java 中的函数 sessionEvent
在这个 sessionEvent() 方法中(下面是 Jboss 源代码),
// Was the session destroyed as the result of a timeout or // the undeployment of the containing webapp? // If so, we'll just remove the expired session from the // SSO. If the session was logged out, we'll log out // of all sessions associated with the SSO. boolean timedOut; boolean stopped = false; if ((timedOut = isSessionTimedOut(session)) || (stopped = isManagerStopped(session))) { WebLogger.WEB_SSO_LOGGER.tracef("remove session %s from SSO %s, isSessionTimedOut=%s, isManagerStopped=%s", session, ssoId, timedOut, stopped); removeSession(ssoId, session); // Quite poor. We hijack the caller thread (the Tomcat background thread) // to do our cleanup of expired sessions processExpires(); } else { WebLogger.WEB_SSO_LOGGER.tracef("user logged out of SSO %s", ssoId); // The session was logged out. logout(ssoId); }
控制在会话超时时转到 IF 块,在手动注销时转到 ELSE 块。
- 在 IF BLOCK 中调用 processExpires(),它用于从 Jboss 缓存中销毁已经过期的会话,但不从 Jboss 缓存中销毁当前会话。
- 当会话理想时间大于会话 maxInactiveInterval 时。控件转到上述代码片段的 IF 块。这导致 Jboss 缓存保存会话。(但预计会从 Jboss 缓存中销毁会话)
- 当我在 1 小时后打开浏览器时(通过终止其进程来终止)。它提示我重新加载旧状态的窗口。当我按下重新加载。由于浏览器会话被 Jboss 服务器捕获,因此应用程序会自动登录。但预计会提示登录页面。
这是一个安全问题。即使在终止客户端浏览器之后,我也可以使用 curl 请求(如 ajax 请求)访问服务器。
这是一个现有的问题吗?或 Jboss 中可用的任何修复程序?
解决方案
推荐阅读
- linux - 如果调用进程在用户空间中,如何在内核模块中打开文件?
- angular - 为什么我在刷新时看到隐藏的 DOM 元素?
- redis - 如何启用使用 helm 部署的 bitnami/redis-cluster 日志?
- python - 使用 ruamel.yaml 加载 YAML 时复制别名以分隔 Python 对象
- javascript - Javascript 没有添加 innerText 值
- c - 即使没有按下键,C kbhit() 也会返回 1
- express - 测试项目(mocha+axios+chai)独立,如何统计服务端代码覆盖率
- react-native - @react-navigation/native useNavigation() 笑话
- python - 为什么 Selenium 无法在某些站点上找到元素?
- java - 应用程序在未使用已废弃的许可时崩溃 (KITKAT)