максимальное количество сессий до предела; ограничить максимальное количество пользователей - PullRequest
5 голосов
/ 21 января 2010

Могу ли я узнать, можно ли использовать Spring Security для ограничения максимального числа пользователей, которые могут одновременно заходить на сайт?

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

Ответы [ 3 ]

8 голосов
/ 21 января 2010

Вы можете использовать параллельное управление сессиями 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);
    }
}

Затем вы вводите это в пространство имен безопасности, как описано в справочном руководстве Spring Security .

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

1 голос
/ 21 февраля 2016

У меня недостаточно репутации, чтобы добавить комментарий. Но 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 голосов
/ 27 января 2018

это сообщение немного устарело, но у меня была такая же проблема в весенней безопасности 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;

Аутентификация

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...