5

关于 Servlet 3.0 编程安全性,当会话超时时,无法调用HttpServletRequest#logout().

用户是否保持登录到 JAAS?

如果是这样,在会话超时后处理注销 JAAS 的最佳实践是什么?

容器如何处理用户后续的再次登录请求并在会话超时后创建新会话?

顺便说一句,在使用 Servlet 3.0 编程安全性时,使用以下三种方法来处理会话超时的优缺点是什么:

  1. HttpSessionListener#sessionDestroyed()
  2. 制作@ManagedBean @SessionScoped LoginManager工具HttpSessionBindingListener并在valueUnbound.
  3. 使用 @PreDestroy 注释 LoginManager 中的方法。

任何其他建议的方法/最佳实践建议肯定会受到赞赏。

4

2 回答 2

3

在 Servlet 规范中某处有一个声明,大意是会话无效正好对应于其中没有 Principal 的状态。这是关键。logout() 和 timeout 都使会话无效,并且使会话无效会从中删除 Principal 及其所有值绑定。

JAAS 真正所做的只是允许LoginModules在 aSubject中为用户和他的角色累积 Principals。JAASlogout()方法真正需要做的就是清除由同一模块的login()或更可能commit()的方法添加的主体的主题,如果您向主题添加了诸如私有凭据之类的内容,这实际上只是为了总体安全。由于 logout() 不会由与 login()/commit() 相同的实例执行,因此删除必须基于主体类而不是主体的内部集合。

会话到期时不会调用 JAAS logout(),但是当 Principal 从会话中删除时,这对任何人都无关紧要。

如果您想出于其他原因(例如日志记录)跟踪会话终止,请将您的用户 bean 设置为会话绑定侦听器,并在 valueUnbound() 方法中将终止记录为注销:根据我的经验,这是 100% 可靠的。

要回答您的其他问题,没有“登录到 JAAS”这样的状态:JAAS 为容器提供登录/注销服务,而不是为容器本身提供登录/注销服务;并且新登录是新登录,进入新会话,无论前一个是否过期。

于 2012-07-17T23:00:11.163 回答
2

会话管理与 JAAS 没有直接关联。会话管理实际上取决于您的容器。

在 Jetty 8 中,会话管理由 SessionManager(在上下文级别)和 SessionIdManager(在服务器级别)处理。

浏览器将会话 ID 发送到服务器。实现 SessionManager 的类验证会话 ID。如果会话过期,则会话失效并被移除,并通知会话监听器。

我不确定为什么您需要“注销”用户,但您应该能够将您的注销挂接到侦听器上。

“保持登录 JAAS”对您的容器可能意义不大。Jetty 没有用户/主体/主题缓存,因此除非您像我们一样自己实现缓存,否则您不会“保持登录状态”。

JAAS 模块只提供身份验证和授权;没有其他的。

添加

当会话过期时,服务器会返回 302 并重定向到登录页面。页面上提交的表单调用登录模块(可能是 JAAS 模块),并在成功验证后创建一个新的会话和会话 ID,通常通过 cookie(或 URL 重写)的方式将其发送回浏览器。

除非您的应用程序为所有上下文处理单个上下文 ID,否则我认为您不应该在会话到期时执行任何类型的编程注销;您可以“无效”在另一个上下文中仍然具有有效会话的用户。

于 2012-03-09T18:02:35.380 回答