[JAVA] Rufen Sie eine Liste anderer Sitzungen desselben Benutzers ab, wenn Sie Redis Session mit Spring Boot (Serie 2) verwenden. Entsorgen Sie es auch.

Das Folgende wird der Config-Klasse hinzugefügt, die WebSecurityConfigurerAdapter erbt.

  @Bean
  public <S extends Session> SessionRegistry sessionRegistry(FindByIndexNameSessionRepository<S> sessionRepository) {
    return new SpringSessionBackedSessionRegistry<>(sessionRepository);
  }

Fügen Sie die generierte SessionRegistry zu den HttpSecurity-Einstellungen hinzu.

  @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"))
        //Zusätzliche Minuten von hier
        .and().sessionManagement()
        //Maximal zulässige Anzahl von Sitzungen pro Benutzer
        // -1 ist unbegrenzt
        .maximumSessions(-1)
        //Sitzungsregistrierung, die für mehrere Abmeldungen verwendet wird
        .sessionRegistry(sessionRegistry(null))
        //URL, zu der nach Ablauf der Sitzung gewechselt werden soll(Wenn Sie es nicht einstellen, wird auf diesem Bildschirm eine Fehlermeldung angezeigt.)
        .expiredUrl("/login?logout");
  }

Die Einstellung ist beendet

Danach können Sie eine Liste der Sitzungen desselben Benutzers abrufen, indem Sie die Sitzungsregistrierung als Controller oder Dienst verwenden.

Das folgende Beispiel zeigt, wie dieselbe Benutzersitzung mit Ausnahme der aktuell angemeldeten Sitzung abgemeldet wird.

  @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()) {
      //Rufen Sie eine Liste der Sitzungen für denselben Benutzer ab, der gerade angemeldet ist
      List<SessionInformation> sessions = sessionRegistry.getAllSessions(principal.get(), false);
      for (SessionInformation session : sessions) {
        if (sessionId.equals(session.getSessionId())) {
          //Melden Sie sich nicht nur für die aktuelle Sitzung ab
          continue;
        }
        //Sitzung abgelaufen und abgemeldet
        session.expireNow();
      }
    }
    return "redirect:/";
  }

Mit sessionRegistry.getAllSessions können Sie eine Liste der Sitzungen desselben Benutzers abrufen, die die im ersten Argument übergebenen Benutzerinformationen enthalten.

Wenn Sie eine Liste der Sitzungen eines Benutzers anstelle des angemeldeten Benutzers abrufen möchten, können Sie diese abrufen, indem Sie im ersten Argument die ID eines beliebigen Benutzers eingeben. (Angenommen, ein Administrator usw. meldet einen Benutzer zwangsweise ab.)

    //String
    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);

--Beispiel

Recommended Posts

Rufen Sie eine Liste anderer Sitzungen desselben Benutzers ab, wenn Sie Redis Session mit Spring Boot (Serie 2) verwenden. Entsorgen Sie es auch.
Rufen Sie den in der Controller-Klasse von Spring Boot definierten Pfad als Liste ab
Rufen Sie in Spring Boot eine Proxy-Instanz der Komponente selbst ab
Spring Boot (1 Serie) + spring-security-oauth2 + Redis Session + Heroku mit SerializationException
[Ruby] Gewöhnen Sie sich an, beim Erstellen einer Kopie einer Zeichenfolgenvariablen die dup-Methode zu verwenden
Unbekannter Fehler in Zeile 1 von pom.xml bei Verwendung von Spring Boot in Eclipse
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
[Spring Boot] POST-Datei-Array / Liste und andere Daten gleichzeitig [Axios]
So erhalten Sie den Klassennamen des Arguments von LoggerFactory.getLogger, wenn Sie SLF4J in Java verwenden
Geben Sie die statische Ressourcencodierung in Spring Boot an
Holen Sie sich eine Liste der Klassen in einem Guava-spezifischen Paket