2012-11-20 13 views
5

Ich habe eine Webanwendung mit Federsicherheit entwickelt. Für den Login erhält er Zugriff von LDAP. Jetzt möchte ich die Sitzung mit Feder Sicherheit selbst verwalten, kann ich sehen, indem ich authentication.getName() Ich bekomme die username und ich kann auch die sessionID bekommen.Sitzungsverwaltung mit Spring Security: Concurrent-Sitzungen

Jetzt möchte ich sicherstellen, wenn der gleiche Benutzer versucht, sich vom selben System mit einem anderen Browser einzuloggen, sollte er eine Nachricht erhalten, die besagt, dass er sich bereits in seinem Konto eingeloggt hat.

Kann jemand eine Idee geben, wie man das erreicht ????

<security:session-management 
     invalid-session-url="/login.jsp?error=sessionExpired" 
     session-authentication-error-url="/login.jsp?error=alreadyLogin"> 
    <security:concurrency-control 
       max-sessions="1" 
       expired-url="/login.jsp?error=sessionExpiredDuplicateLogin" 
       error-if-maximum-exceeded="false" /> 
</security:session-management> 

Wenn ich diese verwenden und versuchen, unter Verwendung eines anderen Browser um sich einzuloggen es mir die folgende Störung gibt:

HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalStateException: Cannot call sendError() after the response has been committed 
enter code here 

Antwort

6

Ich kann etwas fehlt, aber ich habe die nächste Konfiguration ausprobiert und es funktioniert wie erwartet:

<!-- more configuration stuff --> 

<sec:form-login login-page="/login.jsp" 
    default-target-url="/defaultTarget.jsp" 
    authentication-failure-url="/login.jsp?error=true" 
    login-processing-url="/login" always-use-default-target="true" /> 

<sec:session-management> 
    <sec:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" /> 
</sec:session-management> 

Wenn ich versuche, einen anderen Browser mit der gleichen Benutzerkennung anmelden, es nimmt mich das /login.jsp und zeigt Fehlermeldung: Maximum sessions of 1 for this principal exceeded

EDIT: Sie müssen auch diese platzieren in Ihrer web.xml

<listener> 
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> 
</listener> 
+0

Ich habe die fsame Konfiguration, wie Sie vorschlagen. Plus JdbcTokenRepositoryImpl. Mit all dem logge ich mich mit einem Browser ein; und dann melde ich mich wieder mit einem anderen an. Es scheint, dass der zweite eingeloggt ist, und es ist in der Tat. Mein Problem ist, klicke ich einen Link aus dem ersten Browser bekomme ich die folgende Ausnahme: 'Estado HTTP 500 - PreparedStatementCallback; schlechte SQL-Grammatik [delete from persistent_logins wo username =?]; [blah blah]: Tabelle 'gbt.persistent_logins' existiert nicht '. Und der Tisch ist tatsächlich aus der DB verschwunden !!! Hat jemand eine Idee von dem, was vor sich geht? – kazbeel