[JAVA] Obtenez une liste des autres sessions du même utilisateur lorsque vous utilisez Redis Session avec Spring Boot (série 2). Jetez-le également.

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

Obtenez une liste des autres sessions du même utilisateur lorsque vous utilisez Redis Session avec Spring Boot (série 2). Jetez-le également.
Obtenez le chemin défini dans la classe Controller de Spring Boot sous forme de liste
Obtenez une instance proxy du composant lui-même dans Spring Boot
Spring Boot (série 1) + spring-security-oauth2 + Redis Session + Heroku avec SerializationException
[Ruby] Prenez l'habitude d'utiliser la méthode dup lors de la copie d'une variable chaîne
Erreur inconnue dans la ligne 1 de pom.xml lors de l'utilisation de Spring Boot dans Eclipse
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
[Spring Boot] Tableau / liste de fichiers POST et autres données en même temps [Axios]
Comment obtenir le nom de classe de l'argument de LoggerFactory.getLogger lors de l'utilisation de SLF4J en Java
Spécifiez le codage des ressources statiques dans Spring Boot
Obtenez une liste de classes dans un package spécifique à Guava