Spring Security, вход в систему и параллельные сеансы - PullRequest
4 голосов
/ 08 сентября 2010

Я пытаюсь запретить пользователю подписываться более одного раза (что приводит к истечению срока предыдущего сеанса).

Я проверил документацию по теме здесь .Я настроил это очень похоже на документацию, но пользователи не ограничиваются одним сеансом за раз.Я могу войти в систему несколько раз (в разных браузерах) с одним и тем же пользователем, и у меня будет несколько одновременных сеансов.

Вот то, что я считаю важными частями моей настройки безопасности.Я использую пользовательские реализации UserDetailsService, UserDetails и AuthenticationFilter.


    <http entry-point-ref="authenticationEntryPoint">
        <!-- Make sure everyone can access the login page -->
        <intercept-url pattern="/login.do*" filters="none" />

        [...]

        <custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
        <custom-filter position="FORM_LOGIN_FILTER" ref="authenticationFilter" />

        <logout logout-url="/logout" logout-success-url="/login.do" />
    </http>

    <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="userDetailsService">
            <password-encoder hash="sha" />
        </authentication-provider>
    </authentication-manager>

    <beans:bean id="userDetailsService" class="[...]">
        <beans:property name="userManager" ref="userManager" />
    </beans:bean>

    <beans:bean id="authenticationFilter" class="[...]">
        <beans:property name="authenticationManager" ref="authenticationManager" />
        <beans:property name="eventPublisher">
            <beans:bean
                class="org.springframework.security.authentication.DefaultAuthenticationEventPublisher" />
        </beans:property>
        <beans:property name="filterProcessesUrl" value="/security_check" />
        <beans:property name="authenticationFailureHandler">
            <beans:bean
                class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
                <beans:property name="defaultFailureUrl" value="/login.do?login_error=true" />
            </beans:bean>
        </beans:property>
        <beans:property name="sessionAuthenticationStrategy"
            ref="sessionAuthenticationStrategy" />
    </beans:bean>

    <beans:bean id="authenticationEntryPoint"
        class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
        <beans:property name="loginFormUrl" value="/login.do" />
    </beans:bean>

    <beans:bean id="concurrencyFilter"
        class="org.springframework.security.web.session.ConcurrentSessionFilter">
        <beans:property name="sessionRegistry" ref="sessionRegistry" />
        <beans:property name="expiredUrl" value="/login.do?login_error=true!" />
    </beans:bean>

    <beans:bean id="sessionAuthenticationStrategy"
        class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
        <beans:constructor-arg name="sessionRegistry"
            ref="sessionRegistry" />
        <beans:property name="maximumSessions" value="1" />
    </beans:bean>

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

Я также зарегистрировал org.springframework.security.web.session.HttpSessionEventPublisher в качестве прослушивателя в моем файле web.xml.

Насколько яможете сказать, я настроил это в соответствии с документацией.Я не могу сказать, почему это не работает.Может ли это быть связано с тем, что я использую форму входа на основе формы?Или мои пользовательские реализации, упомянутые выше?

Ответы [ 2 ]

9 голосов
/ 09 сентября 2010

Я понял это. Если вы переопределите UserDetails, вы должны предоставить метод hashCode () для использования SessionRegistryImpl. Это не упомянуто в документации.

2 голосов
/ 01 апреля 2014

Я знаю, что на этот вопрос уже дан ответ, но есть гораздо более простое решение, которое не требует настройки определенных фильтров.Вы можете добавить к тегу http следующий XML для настройки ваших сеансов:

<session-management invalid-session-url="/login">
  <concurrency-control max-sessions="1" expired-url="/login" />
</session-management>

Остальная конфигурация входа в систему на основе форм также чрезмерно сложна.Я написал здесь пост http://codehustler.org/blog/spring-security-form-login-tutorial/, в котором показано, как правильно настроить форму входа в систему.

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