Классы одновременного управления сеансами никогда не вызывались

Это использует Spring Security 4.0 RELEASE и Spring Security CAS.

Я настраиваю управление параллельным сеансом с помощью Java Config:

http
  .sessionManagement()
  .maximumSessions(1)
  .maxSessionsPreventsLogin(false)
  .expiredUrl("/tooManySessions")
  .and()
  .and();

HttpSessionEventublisher включен в WebApplicationInitializer и я могу подтвердить, что это работает, поскольку я использую это для других вещей, которые работают:

@Override
protected void registerDispatcherServlet(ServletContext servletContext) {
    super.registerDispatcherServlet(servletContext);


    // to handle session creation and destruction events
    servletContext.addListener(new HttpSessionEventPublisher());
}

Однако во время выполнения похоже, что код никогда не вызывается.

Обратите внимание, что я использую Spring Security CA. Может ли это повлиять на управление параллелизмом сеанса?

1 ответ

Оказывается, что для того, чтобы Session Management работал с CAS при использовании Java Config (не знаю о конфигурации XML), вам нужно убедиться, что вы явно указали SessionAuthenticationStrategy(ы) на CASAuthorizationFilter,

Я решил это с помощью ObjectPostProcessor на CsfrFilter (выполнение этого в настройке управления сеансом не получит специфичный для Csrf SessionAuthenticationStrategy):

final CasAuthenticationFilter casAuthenticationFilter = casAuthenticationFilter();

http
        .csrf()
            .withObjectPostProcessor(new ObjectPostProcessor<CsrfFilter>() {
                @Override
                public <O extends CsrfFilter> O postProcess(O csrfFilter) {

                    try {
                        final SessionAuthenticationStrategy sessionAuthenticationStrategy = httpFinal.getSharedObject(SessionAuthenticationStrategy.class);
                        if (sessionAuthenticationStrategy == null || !(sessionAuthenticationStrategy instanceof CompositeSessionAuthenticationStrategy)) {
                            throw new IllegalStateException("Cannot get CompositeSessionAuthenticationStrategy");
                        }
                        casAuthenticationFilter.setSessionAuthenticationStrategy(sessionAuthenticationStrategy);
                    } catch (Exception e) {
                        throw new IllegalStateException("Cannot get ahold of CasAuthenticationFilter in CsrfFilter post-processor");
                    }

                    return csrfFilter;

                }
            });
}
Другие вопросы по тегам