복붙노트

[SPRING] 스프링 한계 최대 세션; 최대 사용자 수 제한

SPRING

스프링 한계 최대 세션; 최대 사용자 수 제한

나는 봄 보안을 사용하여 동시에 웹 사이트에 로그인 할 수있는 최대 사용자 수를 제한 할 수 있음을 알고 있습니까?

확실히, 동시 세션 제어 매개 변수가 아닙니다. 내가 원한 것은 예를 들어, 최대 1000 명의 사용자가 동시에 로그인 할 수 있도록 제한하고 싶습니다. 최대 사용자 수가 초과되었음을 알리는 포워드 통보 페이지 이상

해결법

  1. ==============================

    1.SessionRegistry에 액세스하여 현재 로그인중인 사용자 수를 봄으로써 Spring Security의 동시 세션 제어를 사용할 수 있습니다. Spring Security 3에서 ConcurrentSessionControlStrategy는 로그인 후 사용자가 세션을 생성 할 수 있는지 여부를 제어합니다. 이 클래스를 선택하고 사용자 수에 따라 추가 검사를 추가하십시오.

    SessionRegistry에 액세스하여 현재 로그인중인 사용자 수를 봄으로써 Spring Security의 동시 세션 제어를 사용할 수 있습니다. 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를 사용자 정의합니다.

  2. ==============================

    2.코멘트를 추가 할만큼 충분한 평판이 없습니다. 그러나 getAllPrincipals는 만료 된 세션의 주체를 포함하여 모든 주체를 반환합니다. getAllActiveSessions에는 다음과 같은 메소드를 사용하십시오.

    코멘트를 추가 할만큼 충분한 평판이 없습니다. 그러나 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();
    }
    
  3. ==============================

    3.이 게시물은 약간 오래된 것이지만 나는 스프링 보안 4.1에서 같은 문제를 겪었고 그런 식으로 해결했다.

    이 게시물은 약간 오래된 것이지만 나는 스프링 보안 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>
    

    session-authentication-strategy-ref

    <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

  4. from https://stackoverflow.com/questions/2106601/spring-limit-max-sessions-limit-max-users by cc-by-sa and MIT license