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

0

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

       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ę?

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.

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.

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ć

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.

1

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

0

Pytanie - z czego korzystasz przy trzymaniu sesji?

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ę!

1 użytkowników online, w tym zalogowanych: 0, gości: 1