只允许1个用户登录Spring Security

时间:2014-12-17 02:16:28

标签: spring-mvc spring-security

我有两个用户:A和B,如果用户A首先登录,则用户B无法登录util用户A注销。每个用户都需要三个登录信息:storeId,storePassword,userPassword。

如果用户B与用户A的storeId相同,则不允许登录

如果用户B与用户A的storeId不同,则允许登录

我使用ServletContext来保存已记录的用户,当记录用户单击注销时,我将从ServletContext中删除该用户。但是,当用户关闭浏览器点击注销时,我无法处理。我认为这不是一个好主意

这是我的代码

@Override
public void onLogoutSuccess(HttpServletRequest request,
        HttpServletResponse response, Authentication authentication)
        throws IOException, ServletException {
    //redirectStrategy.sendRedirect(request, response, "/login");
    // do whatever you want
    ServletContext context = request.getSession().getServletContext();
    Object _auths = context.getAttribute("_authentications");
    if(_auths != null) {
        List<String> auths = (List<String>) _auths;
        auths.remove(authentication.getName());
        if(auths.size() == 0) {
            auths = new ArrayList<String>();
        }
        context.setAttribute("_authentications", auths);
    }
    super.onLogoutSuccess(request, response, authentication);
}

有人给我一个很好的解决方案吗? 谢谢

2 个答案:

答案 0 :(得分:1)

我已经解决了我的问题,我在ServletContext的AuthencationProvide intead中使用SessionRegistry

@Autowired
@Qualifier("sessionRegistry")
private SessionRegistry sessionRegistry;

List<Object> principals = sessionRegistry.getAllPrincipals();

for (Object principal: principals) {
    String[] auths = principal.toString().split(StringPool.DASH);
    if(auths.length == 4 && auths[1].equals(storeId)) {
        throw new BadCredentialsException(auths[0]+StringPool.DASH+auths[1]);
    }
}

这段代码在会话超时,用户关闭浏览器时效果很好。而且我不需要任何js源代码来处理

答案 1 :(得分:0)

您可以使用下面的js在窗口关闭时从servletContext中删除用户:

  <script type="text/javascript">
     window.onbeforeunload = logout;

     function logout(){
        // Make an ajax call to remove user from ServletContext
        alert("Window close is being called");
        return false;
     }
  </script>