Как ограничить несколько входов в систему для одного идентификатора пользователя?

Я создал REST-приложение. В этом пользователь может зарегистрироваться и войти. У меня есть проблема, например, если пользователь входит в систему с рабочего стола-1 с учетными данными и тем же входом пользователя с теми же учетными данными с рабочим столом-2. Я должен ограничить доступ пользователя к учетной записи. Означает, что если пользователь входит в систему с рабочего стола-2, я должен выйти из учетной записи рабочего стола-1.

Как я могу добиться этого, используя весеннюю безопасность? Могу ли я сделать это с конфигурацией фильтра JWT или управлением сеансом с помощью весенней безопасности?

Есть ли другой способ справиться с моим сценарием?


person Shubham Pratap    schedule 21.01.2020    source источник
comment
Ваше требование может быть выполнено с помощью Concurrent Session Filter. документы. spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/   -  person ardatosun    schedule 21.01.2020
comment
Не могли бы вы поделиться своей конфигурацией безопасности?   -  person Eleftheria Stein-Kousathana    schedule 22.01.2020


Ответы (1)


Ваш вопрос о весне с JWT. Вы хотите заставить пользователей входить в систему только с 1 устройства.

Я столкнулся с той же проблемой (не с spring, а с сервером node-express, но решение общего назначения, может быть реализовано на любом языке с любой структурой). Причина, по которой вы столкнулись с проблемой, связана с JWT.

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

Что может быть решением: (которое я также реализовал после многих исследований):

не используйте JWT для приложений такого типа, где сеанс пользователя должен быть ограничен номером устройства. Вместо этого используйте случайные токены в базе данных в памяти, такие как Redis. Для одного пользователя создайте случайный токен и отправьте его через файл cookie только для http клиенту, если вход в систему выполнен успешно, и сохраните его в Redis, например db. Затем каждый раз, когда пользователь отправляет запрос, вы автоматически получаете файл cookie, затем вы можете проверить файл cookie с помощью Redis или другой базы данных в памяти, если такой файл cookie существует и соответствует, значит, пользователь является подлинным.

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

** Специальное примечание: я использовал Redis, это не означает, что вы должны использовать то же самое, вы можете использовать другие базы данных в памяти, также общая база данных также будет работать, как mongodb, MySQL или Pgsql и т. д. Но эти традиционные запросы к базе данных заняли дополнительное время. (проблема с задержкой), что может привести к увеличению времени отклика. Базы данных в памяти работают быстро, так как доступ к ОЗУ гораздо быстрее.

person subhadip pahari    schedule 16.09.2020