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

SpringBoot Security - wylogowywanie z poziomu admina innych użytkowników
K5
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 2 lata
  • 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:prawie 5 lat
  • Ostatnio:ponad 4 lata
  • 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:ponad 7 lat
  • Ostatnio:ponad 2 lata
  • 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ć

Charles_Ray
Bez jaj, tworzysz handlera przez „new” i to ma zadziałać?
K5
z jajami ale działa sprawdź :)
TS
@Charles_Ray: jeśli mnie pamięć nie myli to tam gdzieś na dole jest ThreadLocal. Może działać dopóki nie próbuje się wyskalować aplikacji.
Charles_Ray
No to już lepiej coś w stylu SecurityContextHolder.clearContext();
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • 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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
pedegie
  • Rejestracja:około 11 lat
  • Ostatnio:ponad rok
  • 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

edytowany 1x, ostatnio: pedegie
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około godziny
  • Postów:3584
0

Pytanie - z czego korzystasz przy trzymaniu sesji?

K5
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 2 lata
  • 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.