2016-04-26 2 views
0

Мы используем весеннюю безопасность (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; 
    } 

} 
+0

Обратите внимание, что элемент управления находится в «Принципале» аутентифицированного пользователя. В 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' очень важен. –

+0

Спасибо @BoristheSpider за ваш комментарий. Да, мы используем пользовательский UserDetailsService: «public class UserDetailService реализует org.springframework.security.core.userdetails.UserDetailsService». У этого класса только 1 метод - loadUserByUsername (String userName), в котором мы получаем объект userInfo из базы данных на основе userName. В этом классе нет переопределения метода equals. Вы предполагаете, что нам нужно переопределить метод equals в классе UserDetailsServiceImpl? – user1270392

+0

Не на _service_, а на компоненте вы возвращаетесь из службы. Это обычная реализация ['UserDetails'] (http://docs.spring.io/autorepo/docs/spring-security/3.2.2.RELEASE/apidocs/org/springframework/security/core/userdetails/UserDetails. HTML)? –

ответ

0

Вы можете подтвердить значение свойства для core.web.config.sessionStrategy.maximumSessions.value в среде Prod? Это может быть разным между Prod и другими средами.

+0

Спасибо. Да, мы подтвердили эти значения, и они должны быть как в продуктах, так и в не-prod-средах. Любая идея в моем комментарии к «Несколько серверов»? Не уверен, как все это будет работать в случае кластеризации. – user1270392

+0

Является ли среда prod настроенной для липких сессий? Используете ли вы Spring Session для централизации сеансов во внешнем хранилище или просто используете хранилище сеансов основного сервера? –

+0

Также убедитесь, что ваша конфигурация настроена в соответствии с [reference doc] (http://docs.spring.io/spring-security/site/docs/3.2.9.RELEASE/reference/htmlsingle/#concurrent-sessions). В вашей текущей конфигурации «core-security-context.xml» могут отсутствовать некоторые из основных компонентов. –