Функция «Запомнить меня» не работает, когда два или более запросов приходят одновременно. (без весенней безопасности)

Я пытаюсь решить проблему, связанную с запоминанием меня. Эта функция была собрана вручную, без 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 секунд.

Как решить эту проблему с синхронизацией?


person user2652379    schedule 29.05.2017    source источник