我想知道,使用Spring Security,我是否可以验证用户会话,只允许打开一个浏览器选项卡。有可能吗?
我还想知道我是否可以做到这一点,当用户关闭选项卡并在会话结束前再次打开它时,SessionFilter从直接应用程序中过滤它,而不需要进入登录屏幕。
我使用的是JSF 1.2、RichFaces 3.3.3、Hibernate和其他。。。
细节:我知道春季安全,我只是在研究它。
现在谢谢你,原谅我英语不好。
再见!
否。Spring Security无法判断请求是来自原始选项卡还是来自新选项卡——这些信息严格来说是客户端信息。从…起http://static.springsource.org/spring-security/site/faq.html:
2.1.
我正在使用Spring Security的并发会话控制以防止用户一次登录不止一次。当我打开另一个浏览器窗口时登录后,它不会阻止我阻止再次登录。为什么我可以登录不止一次?
浏览器通常维护一个每个浏览器实例的会话。你不能在进行两次单独的会话一旦因此,如果您再次登录您所在的另一个窗口或选项卡在同一会话中重新进行身份验证。服务器对选项卡、窗口或浏览器实例。它看到的只是HTTP请求将它们与特定会话联系起来根据它们包含的JSESSIONID cookie。当用户在会话,Spring Security的并发会话控制检查其他经过身份验证的会话有如果他们已经通过相同会话进行认证,则重新身份验证将没有效应
我找到了一种更简单的方法来完成同样的事情。如果您已经在扩展SimpleUrlAuthenticationSuccessHandler
,类似于@Jagar,请创建一个登录用户的数组列表,将用户添加到其中,然后将其添加到会话中。然后,每次登录时,都要检查会话是否存在,以及该用户是否在会话arraylist属性中。如果是,则失败;如果不是,则允许登录。
这样,可以让多个用户使用同一浏览器登录,但不能让同一用户登录。这也防止了错误地覆盖windowName属性的可能性。
我最近使用Spring Security实现了一个针对多个选项卡/窗口的解决方案。为了成功登录,我使用"LoginScessHandler"并在会话中设置一个唯一的窗口名称。在主模板页面上,我设置了一个窗口名称,并在每个页面上加载验证窗口名称与会话的窗口名称,如果不相同,则重定向到错误页面。
以下是配置和代码:
@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);
}
}
主模板或首页:
<script>
<%if (session.getAttribute("windowNameToSet") != null) {
out.write("window.name = '"
+ session.getAttribute("windowNameToSet") + "';");
session.removeAttribute("windowNameToSet");
}%>
if (window.name != "<%=session.getAttribute("windowName")%>") {
window.location = "<%=request.getContextPath()%>/forms/multiwindowerror.jsp";
}
</script>
对于安全上下文:
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/login.hst**" access="anonymous or authenticated" />
<intercept-url pattern="/**/*.hst" access="authenticated" />
<form-login login-page="/login.hst"
authentication-failure-url="/login.hst?error=true"
authentication-success-handler-ref="loginSucessHandler" />
<logout invalidate-session="true" logout-success-url="/home.hst"
logout-url="/logout.hst" />
<remember-me key="jbcp" authentication-success-handler-ref="loginSucessHandler"/>
</http>
只需确保在login.jsp上不包含JavaScript。