@Configuration
public class SessionConfig {
...
@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
return new HttpSessionEventPublisher() {
@Override
public void sessionCreated(HttpSessionEvent event) {
String sessionId = event.getSession().getId();
event.getSession().setMaxInactiveInterval(sessionTimeout);
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
String sessionId = event.getSession().getId();
}
};
}
@Bean
public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisherRegistration() {
return new ServletListenerRegistrationBean<>(httpSessionEventPublisher());
}
@Bean
public SessionRegistry sessionRegistry() {
return new SessionRegistryImpl() {
@Override
public void registerNewSession(String sessionId, Object principal) {
super.registerNewSession(sessionId, principal);
}
@Override
public void removeSessionInformation(String sessionId) {
super.removeSessionInformation(sessionId);
}
private String extractPrincipalName(Object principal) {
if (principal instanceof User user) {
return user.getEmail();
}
return principal != null ? principal.toString() : "anonymous";
}
};
}
@Bean
public SessionAuthenticationStrategy sessionAuthenticationStrategy(SessionRegistry sessionRegistry) {
ConcurrentSessionControlAuthenticationStrategy concurrentStrategy =
new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry);
concurrentStrategy.setMaximumSessions(maxSessionsPerUser);
concurrentStrategy.setExceptionIfMaximumExceeded(preventLoginWhenExceeded);
SessionFixationProtectionStrategy fixationStrategy = new SessionFixationProtectionStrategy();
RegisterSessionAuthenticationStrategy registerStrategy =
new RegisterSessionAuthenticationStrategy(sessionRegistry);
CompositeSessionAuthenticationStrategy compositeStrategy = new CompositeSessionAuthenticationStrategy(
List.of(
concurrentStrategy,
fixationStrategy,
registerStrategy
)
);
return compositeStrategy;
}
}