2011-01-06 24 views
6

Ich muss Benutzersitzung ungültig machen (oder treten). Die Anwendung beschränkt die Benutzeranmeldung nur auf einen Benutzer pro Container.Invalidate Federsicherheitssitzung

Ich versuche removeSessionInformation aus der Sitzungsregistry aufzurufen, um den Benutzer zu entsperren. Der andere Benutzer kann sich also mit dem Benutzernamen der geklickten Sitzung anmelden.

aber SessionContextHolder bei diesem Benutzer, der getreten wurde, ist immer noch. Daher haben sie immer noch die gleiche Berechtigung, auf die geschützte Seite zuzugreifen.

wie Principal von SessionContextHolder aus angegebenen Sitzungsregistrierungsinformationen zu entwerten oder zu entfernen?

ps: In meiner alten Anwendung gebe ich eine Variable in UserDomain (UserDetails), die HttpSession halten. und wenn sie den Benutzer treten müssen, mache ich nur HttpSession von der angegebenen Benutzerdomäne ungültig. Das weiß ich aber nicht, wie ich es im Frühling machen soll (es ist eher so, Principal von SessionContextHolder als HttpSession zu entfernen). Die Implementierung ist fast identisch mit der von SessionRegistryImpl im Frühjahr.

Antwort

10

gespeichert werden Sie können mögen Spring Security Concurrency Control zu berücksichtigen. Sie können dies so konfigurieren, dass die Anzahl gleichzeitiger Sitzungen pro Benutzer begrenzt wird und bestehende Sitzungen ablaufen (kicken), wenn diese Anzahl überschritten wird. Diese

Spring Security Session Management

ist ein Ausschnitt aus unserer Konfiguration (Frühling 3):

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

Ich denke, würde dies ist der Weg, es zu tun:

SecurityContextHolder.getContext().setAuthentication(null) 

Aus dem SecurityContext.setAuthentication(Authentication) Javadocs:

ändert das aktuell authentifizierte Haupt oder entfernt die Authentifizierungsinformationen.

Parameter: Authentifizierung
- die neue Token-Authentifizierung oder null, wenn keine weiteren Authentifizierungsinformationen sollten

+0

Diese Antwort ist korrekt, stellen Sie sicher, dass Ihre Websitzung ungültig ist. –

+1

hallo Brian, ich denke, Ihre Antwort nur "SecurityContextHolder" der aktuellen Logging-Benutzersitzung ungültig machen (oder entfernen). Was ich brauche, ist den 'SecurityContextHolder' einer anderen Benutzersitzung zu entfernen. Können wir es bei Sping tun? –

+0

dies ist nicht für andere Benutzer – z0mb1ek

0

Diese aus meiner Anwendung-security.xml extrahiert

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

Versuchen Sie, die Linie in fette Buchstaben nach der maximalen Sitzungsnummer

6

Zum Löschen der SpringSecurity-Sitzung können Sie auch folgende Schritte ausführen:

SecurityContextHolder.clearContext() 
Verwandte Themen