2016-01-14 2 views
0

У меня есть приложение, основанное на основе весны. Это приложение позволяет использовать 2 сеанса для каждого пользователя.kill server session spring

<bean id="concurrencyFilter" 
     class="org.springframework.security.web.session.ConcurrentSessionFilter"> 
     <property name="sessionRegistry" ref="sessionRegistry" /> 
     <property name="expiredUrl" value="/faces/pages/templates/error.xhtml" /> 
    </bean> 

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

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

Мне нужно, чтобы при входе в систему со вторым сеансом убейте первую сессию.

Я пробовал это с использованием метода expireNow, но 2 сеанса поддерживают активную работу.

 authenticate = authenticationManager 
       .authenticate(new UsernamePasswordAuthenticationToken(username, password)); 
     if (authenticate.isAuthenticated()) { 
      SecurityContextHolder.getContext().setAuthentication(authenticate); 
      HttpServletRequest httpReq = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext() 
        .getRequest(); 
      HttpServletResponse httpResp = (HttpServletResponse) FacesContext.getCurrentInstance() 
        .getExternalContext().getResponse(); 

      sessionAuthenticationStrategy.onAuthentication(authenticate, httpReq, httpResp); 

      final Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>(); 
      final org.springframework.security.core.userdetails.User user = new org.springframework.security.core.userdetails.User(
        username, password, grantedAuthorities); 

      List<SessionInformation> sessions = sessionRegistry.getAllSessions(user, false); 
      if (sessions.size() > 1) { 
       sessionRegistry.getSessionInformation(sessions.get(0).getSessionId()).expireNow(); 


sessionRegistry.removeSessionInformation(sessions.get(0).getSessionId()); 
       } 

Как это сделать?

спасибо.

+0

Тогда почему в первую очередь вам нужны 2 параллельные сессии ... Вы в основном хотите один. –

+0

Потому что, если у меня только 1 сессия, когда я пытаюсь войти в другое место, я буду заблокирован, и мне нужно это, когда я войду в другое место, закройте первый сеанс и войди на второе место. –

+0

Это зависит от вашей конфигурации. –

ответ