春季极限最大训练; 限制最大用户


问题内容

我是否可以使用Spring Security来限制能够同时登录网站的最大用户数量?

绝对不是并发会话控制参数。例如,我要限制最大只允许1000个用户同时登录。如果超过该通知页面说明已超过最大用户数


问题答案:

您可以通过访问SessionRegistry来查找当前登录的用户,从而使用Spring Security的并发会话控制。在Spring Security
3中,ConcurrentSessionControlStrategy负责控制是否允许用户登录后创建会话。您可以扩展此类,并根据用户数量添加额外的检查:

public class MySessionAuthenticationStrategy extends ConcurrentSessionControlStrategy {
    int MAX_USERS = 1000; // Whatever
    SessionRegistry sr;

    public MySessionAuthenticationStrategy(SessionRegistry sr) {
        super(sr);
        this.sr = sr;
    }

    @Override
    public void onAuthentication(Authentication authentication, HttpServletRequest request, HttpServletResponse response) {
        if (sr.getAllPrincipals().size() > MAX_USERS) {
            throw new SessionAuthenticationException("Maximum number of users exceeded");
        }
        super.onAuthentication(authentication, request, response);
    }
}

然后,您可以按照Spring Security参考手册所述将其注入到安全名称空间中。

在Spring Security 2.0中,并发会话控件的实现略有不同,您可以改为自定义ConcurrentSessionController。