Вопрос по java, spring, session – Разрешить только один сеанс на пользователя

5

У нас есть веб-приложение, разработанное с использованием struts2, spring & amp; спящий режим.

Приложению требуется функциональность, позволяющая одному пользователю войти в систему только из одного браузера.

Скажем, если пользователь x вошел в браузер ПК-1 ff, то он не может быть зарегистрирован из любого другого места.

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

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

Любая лучшая идея для реализации этой функциональности.

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

Возможные дубликаты:this а такжеthat nobeh

Ваш Ответ

6   ответов
0

Если честно, я бы вновь обратился к причинам, по которым вам нужно ограничить пользователя одним входом. Хотя предотвратить вход в них из двух разных браузеров достаточно просто - любое из предложенных предложений сработает - вариант Spring Security проще всего реализовать, если вы можете - все они ломаются, когда пользователь открывает вторую вкладку в том же браузер. Это считается частью той же сессии.

Error: User Rate Limit Exceeded
1

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

Автоматическое закрытие всех предыдущих пользовательских сессий - это хорошо, потому что при нормальном использовании это не проблема, но при совместном использовании логина и пароля никакие два человека не могут работать одновременно с вашим приложением.

0

Сохраняйте пользовательский стек в контексте сервлета, так как это будет один для веб-контейнера. Выполните проверку перед входом пользователя, если имя пользователя, найденное в контексте сервлета, перенаправит его на страницу входа.

13

Поскольку вы уже используете Spring, я бы порекомендовал вам интегрировать ваше приложение с Spring Security.

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

<session-management>
        <concurrency-control max-sessions="1" />
    </session-management>

Если установлено, когда пользователь, имеющий действительный сеанс, пытается войти снова, он сообщит пользователю, что максимальный одновременный доступ установлен в 1.

Прочитайте большев.

Если весенняя безопасность не подходит для вас, тогда:

  1. Use a SessionInterceptor which will check for session validity, if session is valid it will check if user is already logged in to the application (for this you will have to maintain session somewhere for eg database for every successful login), if valid login is found, redirect user again to login page with custom message, or logout already valid session and then redirect him to login again. If you logout earlier session it would mean any successive action in that browser session will have to deal with invalid session.

  2. If case you are also using Servlet in your application then Interceptor wont work for you, in this case you should use a Filter and follow the same steps as detailed above for Interceptor.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

При входе в систему дайте пользователю сгенерированный ID / cookie (достаточно идентификатора сеанса), сохраненный с данными пользователя. Если пользователь отправляет запрос на сервер со старым идентификатором / cookie, скажите, что он вошел в систему в другом месте.

Наоборот, запрещение новой попытки входа в систему имеет свои недостатки - как вы уже видели.

1

Создать карту. Во время регистрации убедитесь, что идентификатор пользователя присутствует в этой карте или нет. Если его не существует, поместите идентификатор пользователя в карту, во время выхода удалите этот идентификатор пользователя.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Amol Ghotankar

Похожие вопросы