Мы используем весеннюю безопасность (org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy) для управления количеством логинов, разрешенным для каждого пользователя. Вот полная конфигурация:Spring security ConcurrentSessionControlStrategy issue
ядро-безопасности 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>
Значение core.web.config.sessionStrategy.maximumSessions.value устанавливается до 10. Согласно моему пониманию, это означает, что один пользователь может иметь 10 разных сеансов входа в систему. Когда этот пользователь пытается войти в систему на 11-м месте одновременно, ему не разрешается.
Но в нашем случае, пользователь может успешно войти в 5 раз одновременно, но когда мы пытается войти в систему с 6-го места, мы получаем ниже исключения:
Authentication request failed: org.springframework.security.web.authentication.session.SessionAuthenticationException: ConcurrentSessionControlStrategy.exceededAllowed
Кто-нибудь сталкивался аналогичный вопрос? Это очень сложно отладить, потому что это происходит только в производственной среде. QA, UAT и другие среды отлично работают. Одно большое различие между Prod и другой средой заключается в том, что в prod есть несколько серверов приложений (в нашем случае 4), где QA и UAT имеют только 1 сервер. Может быть, это причина, или это что-то другое.
Изучая это, я заметил, что класс ConcurrentSessionControlStrategy теперь устарел. Вместо этого он говорит, что использует ConcurrentSessionControlAuthenticationStrategy. Любая идея, почему этот класс был отменен? Может быть, из-за ошибки в этом классе?
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;
}
}
Обратите внимание, что элемент управления находится в «Принципале» аутентифицированного пользователя. В Spring Security это реализация ['UserDetails'] (http://docs.spring.io/spring-security/site/docs/3.1.7.RELEASE/apidocs/org/springframework/security/core/userdetails/ UserDetails.html), который вы используете. Если вы используете пользовательский 'UserDetails' (возможно, пользовательский' UserDetailsService'?), То его метод 'equals' очень важен. –
Спасибо @BoristheSpider за ваш комментарий. Да, мы используем пользовательский UserDetailsService: «public class UserDetailService реализует org.springframework.security.core.userdetails.UserDetailsService». У этого класса только 1 метод - loadUserByUsername (String userName), в котором мы получаем объект userInfo из базы данных на основе userName. В этом классе нет переопределения метода equals. Вы предполагаете, что нам нужно переопределить метод equals в классе UserDetailsServiceImpl? – user1270392
Не на _service_, а на компоненте вы возвращаетесь из службы. Это обычная реализация ['UserDetails'] (http://docs.spring.io/autorepo/docs/spring-security/3.2.2.RELEASE/apidocs/org/springframework/security/core/userdetails/UserDetails. HTML)? –