spring-boot-redis : Wie entkräften Sie alle Sitzungen eines Benutzers?
Ich bin neu in redis. Ich habe folgte diesem tutorial zu verwenden HttpSession mit redis.
https://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot.html
Nun meine Bewerbung hat 'Abmelden von allen Geräten" - option. Wenn dieser geklickt wird, wie kann ich die entfernen oder ungültig machen alle Sitzungen des Benutzers?
Auch, wenn der Benutzer ändert sein Passwort, wie kann ich entkräften, alle seine Sitzungen außer der aktuellen Sitzung?
Edit:
Versuchte ich mit Session-Registrierung.
@Autowired
private FindByIndexNameSessionRepository sessionRepository;
@Autowired
FindByIndexNameSessionRepository<? extends ExpiringSession> sessions;
@RequestMapping(value = "/logoutalldevices", method = RequestMethod.GET)
public Response test(HttpServletRequest request, HttpServletResponse response) throws Exception {
SpringSessionBackedSessionRegistry sessionRegistry = new SpringSessionBackedSessionRegistry(sessionRepository);
Collection<? extends ExpiringSession> usersSessions = sessions
.findByIndexNameAndIndexValue(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME, "myUserId")
.values();
usersSessions.forEach((temp) -> {
String sessionId = temp.getId();
//sessionRegistry.removeSessionInformation(sessionId);
SessionInformation info = sessionRegistry.getSessionInformation(sessionId);
info.expireNow();
});
return Response.ok().build();
}
Aber es ist nicht die Beseitigung der Sitzung vom redis-db oder ungültig zu machen es. obwohl es hinzufügen ein neues Attribut, um die session mit dem Namen 'sessionAttr:org.springframework.Sitzung.Sicherheit.SpringSessionBackedSessionInformation.ABGELAUFEN "mit dem Wert "true". Ich kann sehen, dass dieser neue Schlüssel-Wert-paar in der redis-db mit Hilfe der redis-client, wenn ich
HGETALL 'sessionid'
Bearbeiten
Ich habe versucht, das löschen der session manuell aus der redis-db mit redistemplate.
@Autowired
RedisTemplate<String, String> redisTemplate;
---------
redisTemplate.delete("spring:session:sessions:" + sessionId);
redisTemplate.delete("spring:session:sessions:expires:" + sessionId);
Diese fast funktioniert. Es löscht den Wert aus der redis-db, aber nicht den Schlüssel.
127.0.0.1:6379> keys *
1) "spring:session:sessions:25635a14-a4f1-4aa1-bf5a-bc20f972eec7"
2) "spring:session:sessions:expires:25635a14-a4f1-4aa1-bf5a-bc20f972eec7"
3) "spring:session:index:org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME:1"
127.0.0.1:6379> hgetall spring:session:sessions:25635a14-a4f1-4aa1-bf5a-bc20f972eec7
1) "lastAccessedTime"
2) "\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01[R'\x15\xc1"
127.0.0.1:6379>
Gelöscht-alle anderen Schlüssel-Werte-Paare, die in der Sitzung außer lastAccessedTime Zeit.
Auch eine seltsam dies ist, das steht in dem log sehe ich in der redis-monitor, wenn redisTemplate.delete("key")
ausgeführt wird:
1491731944.899711 [0 127.0.0.1:62816] "DEL" "spring:session:sessions:25635a14-a4f1-4aa1-bf5a-bc20f972eec7"
1491731944.899853 [0 127.0.0.1:62816] "DEL" "spring:session:sessions:expires:25635a14-a4f1-4aa1-bf5a-bc20f972eec7"
Wenn ich kopieren und fügen Sie die beiden oben genannten Befehle zum redis-client und führen Sie aus, die Tasten sind gelöscht. Ich sehe nicht, Tasten, wenn ich ausführen keys *
mehr. Ich Frage mich, warum der Schlüssel nicht immer gelöscht, wenn sein gelöscht mit RedisTemplate
127.0.0.1:6379> "DEL" "spring:session:sessions:25635a14-a4f1-4aa1-bf5a-bc20f972eec7"
(integer) 1
127.0.0.1:6379> "DEL" "spring:session:sessions:expires:25635a14-a4f1-4aa1-bf5a-bc20f972eec7"
(integer) 1
127.0.0.1:6379> keys *
1) "spring:session:index:org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME:1"
127.0.0.1:6379>
- können Sie teilen Sie Ihre spring security-Konfiguration?
- Ich haben nicht jede Konfiguration. Gerade Hinzugefügt spring-boot-starter-Sicherheit-Abhängigkeit. Das ist es. Muss ich etwas hinzufügen?
- Sie kommentierte
// sessionRegistry.removeSessionInformation(sessionId);
dass sollte funktionieren. Was passiert in deinem Fall? - Ich habe es versucht, das hat nicht funktioniert.
- Würde die
sessionStatus.setComplete()
Arbeit für Ihren Fall?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde gerne wissen Sie, dass
you are following the correct path
für ungültig, der Benutzer-sessionsIrgendwas zu beachten
ist nicht meine Einträge zu entfernen aus dem
redis
Datenbank, nur es hängt die abgelaufen Attribut session, wie Sie zu Recht erwähnt.Aber wie das invalidiert die session des Benutzers?
Hier kommt die ConcurrentSessionFilter ins Spiel, wo
.doFilter()
Methode funktioniert der trick vonautomatically logging out
Hier ist das snippet für ConcurrentSessionFilter
Prost dazu!
Versuchen, diese für die entf-Taste "redisTemplate.opsForValue().getOperations().delete(KEY);"
Versuchen, diese
Wenn Sie nur wollen, zu tun ist ein einmalige Sache im debugging-Prozess, können Sie melden Sie sich einfach in
redis_cli
und bündig alle Redis Schlüssel.