关于应用程序的Spring Max会话,而不是应用程序上用户的最大会话数

时间:2016-04-19 15:30:38

标签: java spring session spring-security

我正在使用jhipster写一个网络应用程序。它正在使用弹簧。我试图限制同一个用户登录我的应用程序的次数,然后用这个来处理名为ServerConfiguration.java的文件:

 @Override
protected void configure(HttpSecurity http) throws Exception {
    http
    .and()
        .formLogin()
        .loginProcessingUrl("/api/authentication")
        .successHandler(ajaxAuthenticationSuccessHandler)
        .failureHandler(ajaxAuthenticationFailureHandler)
        .usernameParameter("j_username")
        .passwordParameter("j_password")
        .permitAll()
    .
    .
    .
    .
    .and()            
        .sessionManagement()
        .maximumSessions(Integer.parseInt(env.getProperty("spring.maxuser.sessions")))
                 .maxSessionsPreventsLogin(true);
    }


@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
    return new HttpSessionEventPublisher();
}

这使得特定用户只能在我的应用程序中多次登录。

现在,我的问题是如何让xdifferent个用户只能打开/访问我的应用程序。例如,我希望我的应用程序只能由200个用户访问。当用户201出现并想要登录时,则不能。

我在另一篇帖子spring limit max sessions ; limit max users上看到了一个答案,但我不知道该代码的确切位置。

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);
}

}

我应该创建这个新类MySessionAuthenticationStrategy如何从httpConfigure类转到这个新类MySessionAuthenticationStrategy

非常感谢。

1 个答案:

答案 0 :(得分:0)

试试这个。 创建一个类来扩展默认会话注册表:

@Component
public class MySessionRegistry extends org.springframework.security.core.session.SessionRegistryImpl {    
}

更新您的配置方法,使其如下所示。

    @Autowired
    MySessionRegistry sessionRegistry; 
    void configure(HttpSecurity http) throws Exception {
        http.formLogin()
                .loginProcessingUrl("/api/authentication")
                .successHandler(ajaxAuthenticationSuccessHandler)
                .failureHandler(ajaxAuthenticationFailureHandler)
                .usernameParameter("j_username")
                .passwordParameter("j_password")
                .permitAll().and()
                .sessionManagement()
                .maximumSessions(Integer.parseInt(env.getProperty("spring.maxuser.sessions")))
                .sessionRegistry(sessionRegistry)
                .maxSessionsPreventsLogin(true);
    }

然后在登录/身份验证期间,请尝试以下操作:

    @Autowired
    MySessionRegistry sessionRegistry; 

    public void onAuthentication(Authentication authentication, HttpServletRequest request, HttpServletResponse response) {
        if (calculateMaxSessions(sessionRegistry) > MAX_USERS) {
            throw new SessionAuthenticationException("Maximum number of users exceeded");
        } else {
            //Authenticate
        }
    }

    public int calculateMaxSessions(SessionRegistry sessionRegistry){
        final List<Object> principals = sessionRegistry.getAllPrincipals();
        if (principals != null) {
            List<SessionInformation> sessions = new ArrayList<>();
            for (Object principal : principals) {
                sessions.addAll(sessionRegistry.getAllSessions(principal, false));
            }
            return sessions.size();
        }
        return 0;
    }

我希望这会有所帮助。干杯!