2016-04-26 4 views
0

Wir verwenden Spring Security (org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy), um die Anzahl der Logins pro Benutzer zu steuern. Hier ist die komplette Konfiguration:Spring-Sicherheit ConcurrentSessionControlStrategy-Problem

Kern-security-context.xml

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

    <bean id="sessionStrategy" 
     class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy"> 
     <constructor-arg name="sessionRegistry" ref="sessionRegistry" /> 
     <property name="maximumSessions" 
      value="${core.web.config.sessionStrategy.maximumSessions.value}" /> 
     <property name="exceptionIfMaximumExceeded" value="true" /> 
    </bean> 

Web.xml

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

Wert von core.web.config.sessionStrategy.maximumSessions.value gesetzt zu 10. Meines Wissens nach bedeutet dies, dass ein Benutzer 10 verschiedene Login-Sitzungen haben kann. Wenn dieser Benutzer versucht, sich gleichzeitig auf dem elften Platz einzuloggen, sollte es ihm nicht erlaubt sein.

Aber in unserem Fall ist der Benutzer in der Lage, erfolgreich gleichzeitig 5 mal einzuloggen, aber wenn wir von Platz 6 einzuloggen versucht, erhalten wir unter Ausnahme:

Authentication request failed: org.springframework.security.web.authentication.session.SessionAuthenticationException: ConcurrentSessionControlStrategy.exceededAllowed 

Hat jemand ähnliches Problem konfrontiert? Es ist sehr schwierig, dies zu debuggen, da dies nur in der Produktionsumgebung geschieht. QA, UAT und andere Umgebung funktioniert gut. Ein großer Unterschied zwischen Prod und anderen Umgebungen besteht darin, dass es in prod mehrere Anwendungsserver gibt (in unserem Fall 4), wobei QA und UAT nur 1 Server haben. Könnte das die Ursache sein oder ist es etwas anderes?

Während ich darüber nachforschte, bemerkte ich, dass die ConcurrentSessionControlStrategy-Klasse jetzt veraltet ist. Stattdessen heißt es, ConcurrentSessionControlAuthenticationStrategy zu verwenden. Irgendeine Idee, warum diese Klasse deprecated war? Könnte es aufgrund eines Fehlers in dieser Klasse sein?

public class UserInfo implements org.springframework.security.core.userdetails.UserDetails { 

@Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     UserInfo other = (UserInfo) obj; 
     if (userEntityId == null) { 
      if (other.userEntityId != null) 
       return false; 
     } else if (!userEntityId.equals(other.userEntityId)) 
      return false; 
     return true; 
    } 

} 
+0

Beachten Sie, dass sich das Steuerelement auf dem "Principal" des authentifizierten Benutzers befindet. In Spring Security ist dies die Implementierung von ['UserDetails'] (http://docs.spring.io/spring-security/site/docs/3.1.7.RELEASE/apidocs/org/springframework/security/core/userdetails/ UserDetails.html), die Sie verwenden. Wenn Sie ein benutzerdefiniertes 'UserDetails' verwenden (vielleicht ein benutzerdefiniertes' UserDetailsService'?), Dann ist seine 'equals' Methode sehr wichtig. –

+0

Danke @BoristheSpider für Ihren Kommentar. Ja, wir verwenden den benutzerdefinierten UserDetailsService: "public class UserDetailService implementiert org.springframework.security.core.userdetails.UserDetailsService". Diese Klasse hat nur eine Methode - loadUserByUsername (String userName), in der wir das userInfo-Objekt von der Datenbank basierend auf userName abrufen. Es gibt kein Überschreiben der equals-Methode in dieser Klasse. Schlägst du vor, dass wir die equals-Methode in der UserDetailsServiceImpl-Klasse überschreiben müssen? – user1270392

+0

Nicht auf dem _service_, sondern auf der Bean, die Sie vom Dienst zurückgeben. Ist das eine benutzerdefinierte Implementierung von ['UserDetails'] (http://docs.spring.io/autorepo/docs/spring-security/3.2.2.RELEASE/apidocs/org/springframework/security/core/userdetails/UserDetails. html)? –

Antwort

0

Können Sie den Eigenschaftswert für core.web.config.sessionStrategy.maximumSessions.value in der Prod-Umgebung bestätigen? Es kann zwischen Prod und anderen Umgebungen unterschiedlich sein.

+0

Danke. Ja, wir haben diese Werte validiert und sie sind, was sie in der Prod- und Non-Prod-Umgebung sein sollten. Irgendeine Idee zu meinem Kommentar zu "Multiple Server"? Ich bin mir nicht sicher, wie das Ganze im Falle einer Cluster-Umgebung funktionieren wird. – user1270392

+0

Ist die Prod-Umgebung für Sticky-Sitzungen konfiguriert? Verwenden Sie Spring Session, um Sitzungen in einem externen Geschäft zu zentralisieren oder einfach den zugrunde liegenden Server-Sitzungsspeicher zu verwenden? –

+0

Stellen Sie außerdem sicher, dass Ihre Konfiguration gemäß [Referenzdokument] eingerichtet wurde (http://docs.spring.io/spring-security/site/docs/3.2.9.RELEASE/reference/htmlsingle/#concurrent-sessions). Ihre aktuelle Konfiguration "core-security-context.xml" enthält möglicherweise einige der Kernkomponenten. –