Ce qui suit est ajouté à la classe Config qui hérite de WebSecurityConfigurerAdapter.
@Bean
public <S extends Session> SessionRegistry sessionRegistry(FindByIndexNameSessionRepository<S> sessionRepository) {
return new SpringSessionBackedSessionRegistry<>(sessionRepository);
}
Ajoutez le SessionRegistry généré aux paramètres HttpSecurity.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/secure.html").authenticated().anyRequest().permitAll()
// login settings
.and().formLogin()
// ligout settings
.and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout", "GET"))
//Minutes supplémentaires d'ici
.and().sessionManagement()
//Nombre maximum de sessions autorisées par utilisateur
// -1 est illimité
.maximumSessions(-1)
//Registre de session utilisé pour plusieurs déconnexions
.sessionRegistry(sessionRegistry(null))
//URL vers laquelle effectuer la transition lorsque la session expire(Si vous ne le définissez pas, un message d'erreur apparaîtra sur cet écran.)
.expiredUrl("/login?logout");
}
Le réglage est terminé
Après cela, vous pouvez obtenir une liste des sessions du même utilisateur en utilisant le Registre de session comme contrôleur ou service.
Voici un exemple de traitement pour déconnecter la même session utilisateur à l'exclusion de la session actuellement connectée.
@Autowired
private SessionRegistry sessionRegistry;
@RequestMapping("/logoutAnother")
public String logoutAnother(HttpSession currentSession) {
String sessionId = currentSession.getId();
Optional<Object> principal = Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication())
.map(authentication -> authentication.getPrincipal());
if (principal.isPresent()) {
//Obtenez une liste des sessions pour le même utilisateur qui est actuellement connecté
List<SessionInformation> sessions = sessionRegistry.getAllSessions(principal.get(), false);
for (SessionInformation session : sessions) {
if (sessionId.equals(session.getSessionId())) {
//Ne vous déconnectez pas uniquement pour la session en cours
continue;
}
//Session expirée et déconnectée
session.expireNow();
}
}
return "redirect:/";
}
Vous pouvez obtenir une liste des sessions du même utilisateur que les informations utilisateur passées au premier argument avec sessionRegistry.getAllSessions
.
Si vous souhaitez obtenir une liste des sessions de n'importe quel utilisateur au lieu de l'utilisateur connecté, vous pouvez l'obtenir en entrant l'ID de n'importe quel utilisateur dans le premier argument. (En supposant qu'un administrateur etc. déconnecte de force tout utilisateur)
//Chaîne
List<SessionInformation> sessions = sessionRegistry.getAllSessions("user", false);
// UserDetails: userDeails.getUsername() => "user"
List<SessionInformation> sessions = sessionRegistry.getAllSessions(userDeails, false);
// Principal: principal.getName() => "user"
List<SessionInformation> sessions = sessionRegistry.getAllSessions(principal, false);
--Exemple
Recommended Posts