2010-01-21 2 views
4

Возможно, я знаю, что можно использовать весеннюю безопасность, чтобы ограничить максимальное количество пользователей, которые могли одновременно войти на сайт?весенний предельный максимум сеансов; limit max users

Определенно, а не параметр контроля одновременного сеанса. то, что я хочу, например, я хочу ограничить максимум, разрешить только 1000 пользователей одновременно. если больше, чем указано выше, чтобы заметить, что страница с максимальными пользователями превышена

ответ

7

Вы можете использовать параллельный контроль сеанса Spring Security, обратившись к SessionRegistry, чтобы узнать, сколько пользователей в настоящий момент зарегистрировано. В Spring Security 3 ConcurrentSessionControlStrategy отвечает за контроль является ли пользователь может создать сеанс после входа в систему Вы можете расширить этот класс и добавить дополнительную проверку на основе количества пользователей:.

public class MySessionAuthenticationStrategy extends ConcurrentSessionControlStrategy { 
    int MAX_USERS = 1000; // Whatever 
    SessionRegistry sr; 

    public MySessionAuthenticationStrategy(SessionRegistry sr) { 
     super(sr); 
     this.sr = sr; 
    } 

    @Override 
    public void onAuthentication(Authentication authentication, HttpServletRequest request, HttpServletResponse response) { 
     if (sr.getAllPrincipals().size() > MAX_USERS) { 
      throw new SessionAuthenticationException("Maximum number of users exceeded"); 
     } 
     super.onAuthentication(authentication, request, response); 
    } 
} 

Вы бы затем впрыснуть это в пространство имен безопасности, как описано в the Spring Security reference manual ,

В Spring Security 2.0 параллельный контроль сеанса реализован несколько иначе, и вместо этого вы должны настроить ConcurrentSessionController.

+5

Одно очко о getAllPrincipals заключается в том, что оно также возвращает участников из истекших сессий. Мне пришлось перебирать все сеансы с помощью sr.getAllSessions(), чтобы проверить, что я не рассчитываю истекшие. Мои max_users были намного меньше, и истекшие сеансы не были очищены достаточно быстро. – mut1na

1

У меня недостаточно репутации, чтобы добавить комментарий. Но getAllPrincipals возвращает всех участников, в том числе и от истекших сеансов. Для получения getAllActiveSessions используйте следующий метод.

private List<SessionInformation> getActiveSessions(SessionRegistry sessionRegistry) { 
    final List<Object> principals = sessionRegistry.getAllPrincipals(); 
    if (principals != null) { 
     List<SessionInformation> sessions = new ArrayList<>(); 
     for (Object principal : principals) { 
      sessions.addAll(sessionRegistry.getAllSessions(principal,  false)); 
     } 
     return sessions; 
    } 
    return Collections.emptyList(); 
} 
0

Это сообщение немного устарело, но у меня была та же проблема в весенней безопасности 4.1, и я решил это так.

сеанса управления

<security:http disable-url-rewriting="true" use-expressions="true" auto-config="true"> 
    <security:session-management invalid-session-url="/app/login" session-authentication-strategy-ref="sessionAuthenticationStrategy">         
    </security:session-management> 
</security:http> 

сеанса аутентификации Стратегия-исх

<bean id="sessionAuthenticationStrategy" 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="1" /> 
      <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> 

SessionRegistry

@Autowired 
private SessionRegistry sessionRegistry; 

Authentication

List<SessionInformation> sessions = new ArrayList<>(); 
for (Object principal : sessionRegistry.getAllPrincipals()) { 
    sessions.addAll(sessionRegistry.getAllSessions(principal, false)); 
} 
LOGGER.info("Sessiones Activas: " + sessions.size()); 
// filtro para limite de sessiones 
if (sessions.size() < max_sessions) { 
//authentication 
} else { 
    throw new SessionAuthenticationException("Maximo numero de Usuarios exedido."); 
} 

таким образом, потому что я аутентифицируюсь на основе безопасности: custom-filter

Смежные вопросы