我可以使用Spring Security管理多个浏览器选项卡吗?

我想知道,使用Spring Security,我可以validation用户会话,只允许打开一个浏览器选项卡。 可能吗?

我还想知道我是否可以这样做,当用户关闭选项卡并在会话结束之前再次打开它会直接应用程序SessionFilter,而无需进入登录屏幕。

我正在使用JSF 1.2,RichFaces 3.3.3,Hibernate和co …

细节:我知道spring的安全,我只是在研究它。

现在,谢谢,请原谅我糟糕的英语。

再见!

Spring Security无法判断请求是来自原始选项卡还是来自新选项卡 – 该信息严格来自客户端。 来自http://static.springsource.org/spring-security/site/faq.html :

2.1。

我正在使用Spring Security的并发会话控制来阻止用户一次登录多次。 当我在登录后打开另一个浏览器窗口时,它不会阻止我再次登录。 为什么我可以多次登录?

浏览器通常为每个浏览器实例维护一个会话。 您不能同时拥有两个单独的会话。 因此,如果您再次在另一个窗口或选项卡中登录,则只需在同一会话中重新进行身份validation。 服务器对选项卡,窗口或浏览器实例一无所知。 它看到的只是HTTP请求,它根据它们包含的JSESSIONID cookie的值将它们与特定会话联系起来。 当用户在会话期间进行身份validation时,Spring Security的并发会话控制会检查他们拥有的其他经过身份validation的会话的数量。 如果它们已使用相同的会话进行身份validation,则重新进行身份validation将不起作用。

我最近使用Spring Security实现了多个选项卡/窗口的解决方案。 为了成功登录,我使用`LoginSucessHandler“并在会话中设置一个唯一的窗口名称。 在主模板页面上,我设置了一个窗口名称,并在每个页面上加载validation窗口名称和会话的窗口名称,如果它不相同,则重定向到错误页面。

以下是配置和代码:

@Service public class LoginSucessHandler extends SavedRequestAwareAuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException { User user = (User) authentication.getPrincipal(); String windowName = user.getUsername() + new Date().getTime(); HttpSession session = request.getSession(); session.setAttribute("windowName", windowName); session.setAttribute("windowNameToSet", windowName); super.onAuthenticationSuccess(request, response, authentication); } } 

主模板或标题页:

  

对于安全上下文:

        

只需确保不包含JavaScript上面的login.jsp。

我想出了一个更简单的方法来完成同样的事情。 如果您已经扩展了SimpleUrlAuthenticationSuccessHandler ,类似于@Jagar,请创建登录用户的arraylist,将用户添加到其中,然后将其添加到会话中。 然后,每次登录时,检查会话是否存在以及该用户是否在会话arraylist属性中。 如果是,则失败,如果不是,则允许登录。

这样,您可以让多个用户使用相同的浏览器登录,但不能使用同一个用户。 这也防止了错误地覆盖windowName属性的可能性。