Я пытаюсь решить проблему, связанную с запоминанием меня. Эта функция была собрана вручную, без Spring Security. Вот некоторые детали.
- I wanted to use Spring Security to implement remember-me functionality, but...
- We don't have user related data in our DB. The data is only accessible with a 3rd party API. And the API returns the data via cookies. And I don't know how to use this with Spring Security.
- Я работаю на устаревшем сервере без Spring Security. Может быть, немного поздно внедрять Spring Security.
- So I decided to make my own version using an interceptor referencing this. It works like this.
- Remember-me cookie stores "{series}:{hashed token}" string value.
- В БД есть таблица «запомнить меня», в которой хранятся серии, зашифрованные токены, идентификаторы пользователей.
- Перехватчик «запомнить меня» запускается любыми запросами, когда у пользователя есть файл cookie «запомнить меня» И нет пользовательских данных в сеансе.
- Перехватчик сравнивает запоминающиеся значения между cookie и БД. Если это совпадение, выполните процедуру входа в систему и обновите токен. иначе удалите значение cookie.
- It works fine in most cases. But...
- Synchronization problem: Sometimes, two requests come at the same time from a user(I don't know why). A request updates token. But the other doesn't know this. So tokens are different. Deletes the cookie. The user is not logged in.
- Могут быть и другие проблемы, о которых я не знаю.
- Note
- This server has multiple instances. So I guess synchronization block will not work.
- Я не знаю, почему происходит этот двойной запрос. Я изучаю это, но пока безуспешно.
- Considering solutions
- Not to remove the cookie when the remember-me attempt fails. So the cookie will stay and retry when next request comes.
- Таблица «Помни меня» записывает обновленную дату и время. Итак, я могу игнорировать запрос, если время между текущим и обновленным временем меньше x секунд.
Как решить эту проблему с синхронизацией?