/ / Ajout de Spring-session & Redis à la configuration Spring Security Spring Security existante - Spring-Security, Spring-Boot, Spring-Session

Ajout de Spring-Session & Redis à la configuration Spring Security Spring Security existante - Spring-Security, Spring-Boot, Spring-Session

Nous avons actuellement une application Spring-Boot (1.2.1.RELEASE) avec Spring-Security qui s'exécute avec succès.

Nous avons implémenté avec succès le contrôle de concurrence avec la configuration suivante

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig {

@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
@Configuration
protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {

private static final int MAX_CONCURRENT_USER_SESSIONS = 1;

@Override
protected void configure(HttpSecurity http) throws Exception {
http
//snipped
.sessionManagement()
.maximumSessions(MAX_CONCURRENT_USER_SESSIONS)
.maxSessionsPreventsLogin(true)
.sessionRegistry(sessionRegistry());
}

@Bean
public SessionRegistry sessionRegistry() {
SessionRegistry sessionRegistry = new SessionRegistryImpl();
return sessionRegistry;
}

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

Si vous essayez de vous connecter avec le même compte d'utilisateur sur 2 sessions différentes, la deuxième tentative échouera jusqu'à ce que l'utilisateur actuel se déconnecte, comme prévu et requis.

Cela fonctionne très bien dans un environnement à une seule instance, mais nous souhaitons déployer plusieurs disques sur Herkou et, en tant que tels, devons externaliser la session.

Spring-Session + Spring-Boot-Starter-Redis semble être un excellent candidat pour cela.

Dans la documentation de la session de printemps, il est mentionné que tout ce que nous avons à faire est d’ajouter l’annotation @EnableRedisHttpSession et définir un JedisConnectionFactory.

Cela fonctionne et l'ajout d'une annotation entraîne le stockage des sessions dans Redis, ce que je peux voir avec redis-cli.

Toutefois, l'ajout de cette annotation annule le contrôle de concurrence.

Avec l'annotation @EnableRedisHttpSession ajouté, le SessionRegistryImpl les méthodes ne sont jamais invoquées, pas plus que les méthodes HttpSessionEventPublisher.sessionCreated()/sessionDestroy() méthodes.

Cela signifie que lorsque l'utilisateur actuel se déconnecte,l'autre session essayant d'utiliser ce nom d'utilisateur ne pourra toujours pas se connecter et l'utilisateur qui vient de se déconnecter ne pourra pas se reconnecter. En effet, les sessions ne sont jamais supprimées du ??? registre / référentiel ???

Toute idée de la manière dont je pourrais faire fonctionner ma création / destruction de session, tout en utilisant Redis en tant que magasin, serait grandement appréciée.

Réponses:

1 pour la réponse № 1

Nous ne prenons actuellement pas en charge le contrôle de la simultanéité et la session de printemps de Spring Security. Vous pouvez problème existant sur GitHub.

L’idée générale serait d’implémenter l’interface SessionRepository de Spring Security à l’aide de l’interface SessionRepository de Spring Session.

Si vous souhaitez soumettre un PR, ce serait très apprécié!