2011-01-06 14 views
6

Muszę unieważnić (lub kopnąć) sesję użytkownika. aplikacja ogranicza tylko logowanie użytkownika tylko jednego użytkownika na kontener.Invalidate spring security session

Próbuję wywołać metodę removeSessionInformation z rejestru sesji, co służy do odblokowania użytkownika. więc inny użytkownik może zalogować się przy użyciu nazwy użytkownika z uruchomioną sesją.

ale SessionContextHolder dla tego użytkownika, który został wyrzucony, nadal jest. więc nadal mają te same uprawnienia dostępu do chronionej strony.

jak unieważnić lub usunąć główny zasób SessionContextHolder z określonych informacji rejestru sesji?

ps: w mojej starej aplikacji podaję jedną zmienną w UserDomain (UserDetails), która przechowuje HttpSession. a kiedy trzeba wykopać użytkownika, po prostu unieważniam HttpSession z określonego UserDomain. ale nie wiem, jak to zrobić na wiosnę (jego bardziej przypomina usunięcie Principal SessionContextHolder niż HttpSession). wdrożenie jest prawie takie samo jak w przypadku SessionRegistryImpl na wiosnę.

Odpowiedz

10

Można rozważyć podobne Wiosna zabezpieczeń współbieżności kontrolą. Możesz skonfigurować to, aby ograniczyć liczbę jednoczesnych sesji na użytkownika i wygasać (kopać) istniejące sesje, jeśli ta liczba zostanie przekroczona.

Spring Security Session Management

Jest to fragment naszej konfiguracji (wiosna 3):

<http> 
    ... 
    <session-management> 
     <concurrency-control max-sessions="1"/> 
    </session-management> 
    ... 
</http> 
7

Przypuszczam, jest to sposób, aby to zrobić:

SecurityContextHolder.getContext().setAuthentication(null) 

Z SecurityContext.setAuthentication(Authentication) Javadocs:

Zmienia aktualnie uwierzytelnionego mocodawcy lub usuwa informacje uwierzytelniania .

Parametry: uwierzytelniania
- nowa tokenów uwierzytelniania lub null, jeśli nie dalsze informacje uwierzytelniania należy przechowywać

+0

Ta odpowiedź jest prawidłowa, należy również pamiętać o unieważnieniu sesji internetowej. –

+1

cześć brian, myślę, że twoja odpowiedź tylko unieważnia (lub usuwa) 'SecurityContextHolder' bieżącej sesji użytkownika logującego. potrzebuję usunąć 'SecurityContextHolder' z innej sesji użytkownika. możemy to zrobić na sping? –

+0

to nie jest dla innych użytkowników – z0mb1ek

0

ten jest uzyskiwany z mojej aplikacji security.xml

class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy" 
     p:maximumSessions="1" <br> 
        **p:exceptionIfMaximumExceeded="true"** > 
     <constructor-arg name="sessionRegistry" ref="sessionRegistry" /> 

spróbuj dodać linię w pogrubione litery po maksymalnym numerze sesji:

6

Można również wykonać następujące czynności, aby wyczyścić sesję SpringSecurity:

SecurityContextHolder.clearContext()