0

背景

我们正在使用 Glassfish 服务器,并将其配置为启用单点登录 (SSO),这样用户只需验证一次即可访问多个 Web 应用程序。每个 Web 应用程序都指定基于 FORM 的登录 (*j_security_check*),出于开发目的,我们使用File Realm。这工作正常。

Glassfish 会生成一个 Session(范围为用户经过身份验证的 Web 应用程序的路径)和 Cookie (JSESSIONIDSSO),以识别维护服务器(和其他 Web 应用程序)的身份验证状态。

您可以通过在用户 Web 应用会话上调用 Session.invalidate() 来强制用户重新进行身份验证,这也会使 SSO Cookie 无效。这一切都很好。

问题

我们正在寻找一种方法来防止用户同时登录多个。尝试捕获创建后的用户会话(或 SSO Cookie)似乎很自然,并将其存储在由用户名键入的映射中,每当有人点击登录页面时都可以对其进行检查,如果旧会话存在则使其无效。

理想情况下,我们希望在可以访问用户名(或主体对象)和创建的会话的上下文中处理一些身份验证后事件。(我正在查看 HttpSessionListener,但这似乎没有为它所链接的用户提供任何访问权限)。

我试图在没有 kluge(因为我想到几个)的情况下做到这一点,或者在应用程序中引入一些其他全新的框架(例如 Spring Security)。(希望这不需要实现整个 JAAS 模块......)

4

1 回答 1

0

我最终创建了一个自定义 Servlet 过滤器来检查用户是否还没有活动会话。这似乎真的应该是 J2EE 容器的身份验证层提供的服务。

于 2011-03-14T22:24:14.077 回答