Cookie-based аутентификацию следующим образом:
- Написать собственный token-storage, который будет хранить данные userId:token:expiredAt.
- Написать собственный фильтр, который будет выдёргивать userId из токен-сторейджа, дёргать данные про юзера с базы и посредством UsernamePasswordAuthenticationToken производить аутентификацию.
- Когда пользователь логинится POST {"username","password"}, старый токен должен быть инвалидирован (если есть офк), и вместо него в токен-сторейдж запишется новый токен, а в ответе будет Set-Cookie: X-AUTH-TOKEN=<token>.
1. Собственно, насколько это нормальный вариант? Я в курсе про remember-me и т.п., но мне по определённым причинам не нравится реализация спринга (хочется под себя прям подогнать).
2. Так же: не будет ли тут нарушения архитектуры? С одной стороны токен-сторейдж как зависимость контроллера, с другой стороны — зависимость фильтра.
P.S. Это очень общая концепция.
>Я в курсе про remember-me и т.п., но мне по определённым причинам не нравится реализация спринга (хочется под себя прям подогнать). Будет очень полезно озвучить эти причины
Можно использовать PersistentTokenRepository, но тогда надо мириться с PersistentRememberMeToken, а мне надо мапить токен на константный идентификатор пользователя, в то время как username может меняться. Плюс, это всё-таки немножно иной флоу: куки записываются сразу по логину, всегда. Помимо кук будет ещё дополнительная логика.
> дёргать данные про юзера с базы и посредством UsernamePasswordAuthenticationToken я правильно понял что ты хочешь вытягивать из базы пароль в чистом виде и логинить его на каждый запрос?
Нет, он хэширован. Просто заполнять UsernamePasswordAuthenticationToken
Что мешает использовать в токене ид пользователя, а не изменяемый логин? (Ответ: ничего)
С одной стороны ты прав, с другой стороны... Если поле называется username, то я предпочту туда записывать юзернейм. Но это уже дискуссия совсем иного плана.
Какая разница если оно будет лежать глубоко в контексте и использоваться в паре мест?
Мне будет некомфортно. Тем более там String, да можно конвертировать, но это вызовет дополнительный дискомфорт.
Но в целом, я так понимаю, вариант рабочий?
Идентификаторы лучше кроме как строкой и не передавать, даже если в данный момент там выдаваемый базой автоинкремент.
Можно подробнее?
Обсуждают сегодня