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