2012-08-03 7 views
7

Ich bezog mich auf this Thread, und im vorletzten Beitrag von Rob Winch (Feder Security Lead), erwähnt er, dass wir können haben Zugang zum sessionRegisty:Federsicherheit - gibt es eine Möglichkeit, Sitzungsregistrierung in meiner Anwendung zu erhalten (ohne explizite Anpassung der concurrentFilter)

<session-management> 
    <concurrency-control session-registry-alias="sessionRegistry"/> 
</session-management> 

Deshalb habe ich die HttpSessionEventPublisher Filter in web.xml und geben Sie die obige Einstellung in meinem <http> Abschnitt registrieren. Ich NICHT hinzufügen:

<beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl" /> 

und in meiner Klasse, ich spritze eine Instanz sessionRegistry wie folgt aus:

@Autowired 
private SessionRegistry sessionRegistry 

Dies ist, wie ich versuche, die Sitzungen für ein, um herauszufinden, Benutzer:

List<SessionInformation> userSessions = sessionRegistry.getAllSessions(username,false); 
     for (SessionInformation userSession : userSessions){ 
      userSession.expireNow(); 
     } 

Der Auftraggeber ist der Benutzername des Benutzers. Beim Debuggen sind die Variablen der Variablen principals und sessionids leer. Mache ich hier irgendetwas falsch, oder sind die Schritte, die von krams's blog erwähnt werden, der einzige Weg, dies zu tun?

+0

Was funktioniert nicht? – Xaerxess

+0

@Xaerxess - Die Variable SessionRegistry, die eingefügt wird, enthält keine Sitzungs-IDs oder Authentifizierung. Beachten Sie, dass ich die SessionRegistry-Bean nicht explizit definiert habe – Daud

+0

Können Sie den Code der Klasse, die auf 'sessionRegistry' zugreift, veröffentlichen? Wie überprüfen Sie, ob die Registrierung leer ist? – Xaerxess

Antwort

1

zu verfolgen zu lang für einen Kommentar, so antworte ich.

  1. Spring Security-Debugging einschalten (in der log4j.properties Linie log4j.logger.org.springframework.security=DEBUG). Dies sollte bei solchen Problemen Standardprozedur sein, da das Debugging viele nützliche Informationen ausdruckt, die anzeigen können, wo das Problem liegt.

  2. Können Sie debuggen, wenn public void registerNewSession(String sessionId, Object principal) Methode in SessionRegistryImpl nach der Protokollierung aufgerufen wird? Wenn nicht, ist HttpSessionEventPublisher nicht richtig eingerichtet.

  3. Sie verwenden @Autowired private SessionRegistry sessionRegistry; in Ihrer Klasse, nicht wahr?

  4. EDIT: Können Sie überprüfen, ob es Principals in der Registrierung gibt?

    Dabei sind Object s Principals Instanzen, die Sie verwenden.

+3

Dies ist als eine Antwort markiert, aber was ist die Antwort? Ich würde gerne sehen, ob ich die SessionRegistry verwenden kann, ohne die Steuerung des gemeinsamen Zugriffs zu aktivieren. – Eyal

+0

@Eyal, hast du eine Lösung gefunden? – msangel

+0

Nein. Ich habe die Idee aufgegeben, SessionRegistry zu verwenden und stattdessen meine eigene Erweiterung HttpSessionListener zu schreiben. – Eyal

2

Nun können Sie SessionRegistry autowire. Nichts ist falsch. Ich habe es verwendet, um SessionInformation und registrierte Sitzungen für UserPrincipal

+0

Aber ist Was habe ich dafür ausreichend konfiguriert? – Daud

+0

Wenn Sie gemischte Konfiguration (wie oben XML und Anmerkungen) verwenden, dann ist es korrekt. Autowire sessionfactory mit Schnittstelle als: '@Autowired private SessionRegistry sessionRegistry;'. Da auf Ihrem angegebenen Link in der Klasse autowired Bean "SessionRegistryImpl" ist. Ihre XML-Konfiguration für sessionfactory ist korrekt. –

+0

Es funktioniert mit genau der gleichen Einstellung. – Daud

2

es nur für mich gearbeitet, wenn ich Session-registry-Alias-Session-Registry-ref geändert, und zum anderen die Standard-impl:

<security:session-management> 
    <security:concurrency-control max-sessions="10" session-registry-ref="sessionRegistry"/> 
</security:session-management> 

<bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl"/> 
1

Nun, es hängt, welche Version von Feder Sicherheit, die Sie benutzen.

Im Frühling Sicherheit 3. 0 genügt es, die Konfiguration zu haben, wie folgt:

<security:session-management> 
    <security:concurrency-control max-sessions="1"/> 
</security:session-management> 

Da intern wird verwendet Klasse ConcurrentSessionControlStrategy die registerNewSession auf sessionRegistry Objekt aufruft.

Im Frühjahr Sicherheit 3.2 es ist anders und Sie müssen mehr ausführliche Konfiguration verwenden. Es gibt ein Beispiel in der Spring Security reference doc Der wichtigste Teil mit Daten sessionRegistry gefüllt haben, ist folgende:

<beans:bean id="sas" class="org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy"> 
    <beans:constructor-arg> 
    <beans:list> 
     <beans:bean class="org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy"> 
     <beans:constructor-arg ref="sessionRegistry"/> 
     <beans:property name="maximumSessions" value="1" /> 
     </beans:bean> 
     <beans:bean class="org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy"> 
     <beans:constructor-arg ref="sessionRegistry"/> 
     </beans:bean> 
    </beans:list> 
    </beans:constructor-arg> 
</beans:bean> 

<beans:bean id="sessionRegistry" 
    class="org.springframework.security.core.session.SessionRegistryImpl" /> 

Die Registrierung einer neuen Sitzung in sessionRegistry erfolgt in RegisterSessionAuthenticationStrategy Klasse.

Hoffentlich wird es Ihnen helfen.