Классы одновременного управления сеансами никогда не вызывались
Это использует 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;
}
});
}