3

我正在开发一个具有用户身份验证和授权的 vaadin 7 应用程序,该应用程序使用 jaas 和在应用程序服务器 (glassfish) 中定义的领域。

我有这个要求:

  • 用户可以保持登录状态一段时间,这样他就不需要每次都输入密码。
    我通过设置 http 会话的会话超时来做到这一点。

  • vaadin 会话可以锁定一些资源,并且在锁定时,没有其他会话可以使用该资源。当 vaadin 会话关闭时,所有锁定的资源都会被释放。
    我将心跳间隔设置为仅 15 秒。

我无法同时满足这两个要求。如果我将http会话超时设置为一分钟,则在关闭浏览器后一分钟释放资源,但下一次用户没有经过身份验证。
如果我将 https 会话超时设置为某些天,则这次用户已通过身份验证,但 vaadin 会话在 3 次错过心跳后不会立即关闭。只有当用户下次使用相同的 http 会话使用该应用程序时,它才会关闭。

怎么可能同时满足这两个要求?

这里有更多关于我正在使用的技术的信息:

  • 玻璃鱼 4
  • 网络应用程序 3.1
  • vaadin 7.1.7
  • vaadin-cdi 1.0-快照

谢谢你的帮助

4

2 回答 2

2

您可能想看看Spring Security,尤其是Remember-Me Authentication - 我个人会使用的替代方法,而不是自己尝试实现安全的持久登录。

如果你想走DIY之路:

我认为尝试将 Vaadin 与 Http Session 分开并不是一个好主意。Vaadin 书中的应用程序生命周期部分说:

当新客户端连接时,它会创建一个新的用户会话,由 VaadinSession 的实例表示。使用存储在浏览器中的 cookie 跟踪会话。… [Vaadin 会话] 还通过 WrappedSession 提供对较低级别会话对象 HttpSession 和 PortletSession 的访问。

也许您可以通过将登录凭据与 http 会话分开来更改第一个要求的解决方案(“用户可以保持登录一段时间,这样他就不需要每次都输入密码。” )?

您可以将一些时间戳和唯一 ID 存储为 cookie(带有过期日期)并使用您自己的自定义VaadinServletSessionInitListenerSessionDestroyListener检查它(并设置它)并且需要登录凭据或接受来自客户端的凭据,具体取决于在您在服务器上进行的检查。

于 2013-10-29T19:10:38.533 回答
1

您的问题有些模棱两可,但我相信您可以使用自己的 close() 方法解决它。您可以使用自定义的 close() 方法创建自己的 Vaadin Application 类,或者使用 TPTApplication 并覆盖其 close() 方法:

http://vaadin.com/directory#addon/toolkit-productivity-tools:vaadin

确保在会话关闭时调用关闭,并在那里进行清理。这也将在会话结束时调用。

如果您不能确保这一点(即,如果用户只是关闭窗口并且您没有一些 javascript 来处理此问题),您可以使用 Vaadin 拦截关闭窗口,但它的工作量要大得多。当用户尝试关闭窗口时,您会中断该过程,通过回调执行您需要执行的操作,然后让关闭发生。有关如何从 vaadin 进行中断的详细信息如下所示:

https://vaadin.com/forum/#!/thread/44621/44668
https://vaadin.com/forum/#!/thread/83207/83206

回调仅是客户端,因此您必须调用服务器(通过 javascript 获取/发布),该服务器会将会话 ID 传递给您正在监听的 servlet。然后,servlet 将使用传入的会话 id 释放锁。

关键是监听窗口关闭并能够适当地响应它。

于 2013-10-28T15:28:21.800 回答