Управление пользовательскими сеансами Spring Security и функция «Запомнить меня» не работают

Я настроил пользовательское управление сеансом, например:

<sec:session-management session-fixation-protection="none">
<sec:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
</sec:session-management>

И помни меня такой:

<sec:remember-me />
<sec:custom-filter ref="rememberMeFilter" after="REMEMBER_ME_FILTER"/>

<bean id="rememberMeFilter" class="org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter">


<property name="rememberMeServices" ref="rememberMeServices"/>
<property name="authenticationManager" ref="theAuthenticationManager" />
</bean>

<bean id="rememberMeServices" class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="myUserDetailsService"/>
<property name="key" value="springRocks"/>
</bean>

<bean id="rememberMeAuthenticationProvider" class="org.springframework.security.authentication.rememberme.RememberMeAuthenticationProvider">
<property name="key" value="springRocks"/>
</bean>

и когда я вхожу в систему с функцией «Запомнить меня», проверьте и закройте браузер, снова откройте новый браузер и запомните, что я не работаю, вместо этого я получаю сообщение об ошибке превышения сеанса. Потому что я установил max-sessions=1.

Может ли кто-нибудь помочь мне в этом.

Заранее спасибо.


person user3515080    schedule 07.05.2014    source источник
comment
Он работает так, как ожидалось. Вы закрываете браузер, поэтому старая сессия остается. Вы снова открываете браузер, благодаря функции «запомнить меня» вы автоматически входите в систему, но это предотвращается, потому что старый сеанс все еще существует.   -  person M. Deinum    schedule 07.05.2014
comment
@ М.Дейнум, ты прав. Но я хочу реализовать это как Gmail, вы входите в свою почту Gmail с опцией «Запомнить меня», закрываете браузер и снова открываете его, после чего он автоматически войдет в вашу учетную запись.   -  person user3515080    schedule 07.05.2014
comment
Комбинация «запомнить меня» с одновременным сеансом не сработает. Если вы не измените функцию «запомнить меня», чтобы сначала очистить сеансы, но тогда это в основном сделает бесполезным управление одновременным сеансом.   -  person M. Deinum    schedule 07.05.2014
comment
@ M.Deinum, так какое будет решение? потому что я хочу реализовать оба. У вас есть другая идея? Спасибо.   -  person user3515080    schedule 07.05.2014
comment
Зачем вам управление одновременным сеансом? Не создавайте в этом случае исключение, которое аннулирует уже существующий сеанс и запустит новый. Но не уверен, что ты хочешь. Почему-то кажется, что хочется чего-то взаимоисключающего.   -  person M. Deinum    schedule 07.05.2014


Ответы (1)


Я тоже столкнулся с той же проблемой, я хотел использовать контроль параллелизма сеанса, а также запомнить меня. Моя конфигурация немного отличается, я не выдаю пользователю ошибку, если превышена максимальная сессия, вместо этого я просто истекаю старой сессией, чтобы пользователь мог продолжить новую сессию. С фасолью, предоставленной весной, он не будет работать должным образом. Когда я вхожу во второй раз, срабатывает контроль параллелизма и истекает срок действия старого сеанса, затем пользователь продолжает работу с вновь созданным сеансом. Но когда пользователь пытается получить доступ к системе с помощью 1-го сеанса, ConcurrentSessionFilter обнаруживает, что срок действия этого сеанса истек, и перенаправляет на настроенный expired-url, что является нормальным и ожидаемым.

Но мое требование было другим: если пользователь пытается использовать 1-й сеанс, срок действия 2-го сеанса должен быть истек, и пользователь должен пройти повторную аутентификацию, а затем должен быть создан новый сеанс, чтобы пользователь мог продолжить. По сути, пользователь может переключаться между разными браузерами, фактически не вводя имя пользователя/пароль, используя отмеченную опцию «запомнить меня», но на сервере будет только один активный сеанс. Срок действия сеанса истекает/создается, когда пользователь переключается между разными браузерами.

Мне удалось добиться этого, расширив и настроив spring beans. Если ваше требование похоже, я могу помочь вам с моей конфигурацией.

person Thilak    schedule 30.12.2014
comment
Не могли бы вы помочь мне с конфигурацией, у меня есть аналогичные требования в приложении Grails. Как вы этого добились? - person Srinivas Rampelli; 06.09.2016