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;
}
}
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. –
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
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)? –