SpringBoot Security - wylogowywanie z poziomu admina innych użytkowników

SpringBoot Security - wylogowywanie z poziomu admina innych użytkowników
K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

Cześć, chciałem napisać panel administratora do pracy magisterskiej. Stworzyłem panel w którym administrator widzi jakie sesje aktualnie są aktywne.

Kopiuj
       sessionRegistry
               .getAllPrincipals()
               .stream()
               .map(UserDetails.class::cast)
               .filter(userDetails -> userDetails
                       .getUsername()
                       .equals(username))
               .map(userDetails -> sessionRegistry.getAllSessions(userDetails,false))
               .flatMap(Collection::stream)
               .filter(sessionInformation -> {
                   sessionInformation.expireNow();
                   return true;
               })
               .map(SessionInformation::getSessionId)
               .forEach(sessionRegistry::removeSessionInformation);

wywoływanie funkcji sessionInformation.expireNow() i sessionRegistry::removeSessionInformation daje mi to, że sesja znika z listy ale "kicknięty" użytkownik dalej korzysta z RestApi.
Miał ktoś może podobny case i byłby wstanie podać jakąś wskazówkę?

TS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 394
0

Spojrzałem na implementację tego i w sumie to nie wiem w jaki sposób to by miało współgrać ze Spring Web.

Na Twoim miejscu uderzałbym do SessionRepository, którego używasz.

K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0
tsz napisał(a):

Spojrzałem na implementację tego i w sumie to nie wiem w jaki sposób to by miało współgrać ze Spring Web.

Na Twoim miejscu uderzałbym do SessionRepository, którego używasz.

No tak ale to jest już odrębny pakiet którego nie używam i nie wiem czy on jest potrzebny, ja potrzebuję wylogowanie użytkownika o podanym id lub username.

Kopiuj
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null) {
            log.info("Logout user: {}", auth.getName());
            new SecurityContextLogoutHandler().logout(request, response, auth);
        }

ale tutaj nie mam możliwości podania kogo chce wylogować

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
2

Nie znam odpowiedzi na postawione pytanie, ale jakis czas temu chciałem coś poczarować ręcznie w sesjach spring security i podebugowałem ten kod i ciężko trochę, bo tam było kilka różnych session registry i takie ręczne próby manipulacji nimi nie bardzo chciały działać poprawnie. Tak jak teraz zrobiłeś to raczej nie pójdzie i co ciekawe działa to w obie strony -> jakbyś tam spróbował ręcznie "dodać" sesje to też nie zadziała.

pedegie
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 204
1

Nadpisz sobie OncePerRequestFilter i w doFilterInternal jakiś response.sendRedirect( "/saml/logout" ); jak sesja wygasla, wtedy przy kolejnym requescie po wygasnieciu sesji go wywali

W0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3758
0

Pytanie - z czego korzystasz przy trzymaniu sesji?

K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0
pedegie napisał(a):

Nadpisz sobie OncePerRequestFilter i w doFilterInternal jakiś response.sendRedirect( "/saml/logout" ); jak sesja wygasla, wtedy przy kolejnym requescie po wygasnieciu sesji go wywali

Twoje rozwiązanie rozwiązało problem, Dziękuję!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.