我正在开发一个带有用户身份验证和授权的vaadin 7应用程序,使用带有在应用程序服务器(glassfish)中定义的领域的jaas。
我有这个要求:
用户可以保持登录一段时间,这样他每次都不需要输入密码。
我是通过设置http会话的会话超时来完成的。
vaadin会话可以锁定某些资源,而在锁定时,其他任何会话都无法使用此资源。当vaadin会话关闭时,将释放所有锁定的资源 我将心跳间隔设置为仅15秒。
我无法同时满足这两项要求。
如果我将http会话超时设置为一分钟,关闭浏览器后一分钟就会释放资源,但下次用户未经过身份验证。
如果我将https会话超时设置为某些天,则用户将在此时进行身份验证,但在3次错过心跳后,vaadin会话不会立即关闭。只有当用户下次使用相同的http会话时才会关闭它。
如何实现这两个要求?
以下是我正在使用的技术的更多信息:
感谢您的帮助
答案 0 :(得分:2)
您可能希望看一下st Spring Security,尤其是Remember-Me Authentication - 我个人会使用的替代方法,而不是尝试自己实施安全持久登录。
如果你想走DIY路径:
我认为试图将Vaadin与Http Session分开并不是一个好主意。 Application lifecycle section of the Vaadin book说:
当新客户端连接时,它会创建一个新的用户会话,由VaadinSession实例表示。使用存储在浏览器中的cookie跟踪会话。 ... [Vaadin Session]还通过WrappedSession提供对较低级别会话对象HttpSession和PortletSession的访问。
也许您可以更改第一个要求的解决方案("用户可以保持登录一段时间,这样他每次都不需要输入密码。&#34 ; )通过将登录凭据与http会话分开?
您可以将一些带时间戳和唯一ID存储为Cookie(带有过期日期),customize the VaadinServlet
带有您自己的SessionInitListener
和SessionDestroyListener
来检查(并设置)它取决于您在服务器上执行的检查,要么需要登录凭据,要么接受来自客户端的凭据。
答案 1 :(得分:1)
您的问题存在一些含糊之处,但我相信您可以使用自己的close()方法解决它。您可以使用自定义close()方法创建自己的Vaadin Application类,或使用TPTApplication并覆盖其close()方法:
http://vaadin.com/directory#addon/toolkit-productivity-tools:vaadin
确保会话关闭时调用close,并在那里进行清理。会话结束时也会调用此方法。
如果你不能确保这一点(即,如果用户只是关闭窗口并且你没有一些javascript来处理这个),你可以用Vaadin拦截窗口,但它的工作要多得多。当用户尝试关闭窗口时,您将中断该过程,通过回调执行您需要执行的操作,然后关闭该窗口。有关如何从vaadin中断的详细信息如下所示:
https://vaadin.com/forum/#!/thread/44621/44668
https://vaadin.com/forum/#!/thread/83207/83206
回调只是客户端,所以你必须调用服务器(通过javascript获取/ POST),它会将会话ID传递给你已经监听过的servlet。然后,servlet将使用传入的会话ID释放锁。
关键是监听窗口关闭并能够适当地响应它。