Весенние максимальные сеансы в приложении, НЕ максимальные сеансы для пользователя в приложении

Я пишу веб-приложение, используя 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();
}

Это заставляет конкретного пользователя входить в мое приложение столько раз.

Теперь вопрос, который у меня есть, заключается в том, как сделать мое приложение открытым/доступным только для x числа different пользователей. Например, я хочу, чтобы к моему приложению обращались только 200 пользователей. И когда приходит пользователь 201 и хочет войти, он не может.

Я видел в этом другом сообщении максимальный весенний лимит сеансы; ограничить максимальное количество пользователей ответ, но я не знаю, где именно разместить этот код.

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

Большое Вам спасибо.


person Torre    schedule 19.04.2016    source источник


Ответы (1)


Попробуй это. Создайте класс для расширения реестра сеансов по умолчанию:

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

Обновите метод configure, чтобы он выглядел следующим образом.

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

Надеюсь, это поможет. Ваше здоровье!

person JonathanAmos    schedule 19.04.2016
comment
Большое спасибо за Ваш ответ. 1- Итак, мне просто нужно создать этот пустой класс 2- Затем добавить новый экземпляр моего вновь созданного класса в мой SecurityConfiguration.java класс. Я не знаю, как именно работает Autowired. Затем добавьте этот новый атрибут: sessionsRegistry(myNewlyCreatedClassInstance) 3- Я не знаю, где именно я делаю вход/аутентификацию.... :( Я впервые смотрю на этот весенний материал. Куда мне это поместить? Еще раз спасибо - person Torre; 20.04.2016