Spring Security Usercache Andalidation
-
25-09-2019 - |
Вопрос
Использование весенней безопасности у меня есть DaoAuthenticationProvider
Описано как здесь:
http://static.springsource.org/spring-security/site/docs/2.0.x/reference/dao-provider.html.
У меня также есть кэширование (также, как оно описано в этой статье).
Проблема в том, что когда запрос приходит с хорошим именем пользователя (это уже в кэше), но плохой пароль - он возвращает пользователя из кэша, как будто это хорошее имя пользователя / пароль. Поскольку он использует имя пользователя в качестве ключа, пароль вообще не участвует.
Точный код, который возвращает пользователю из кэша:
UserDetails user = this.userCache.getUserFromCache(username);
Кто-нибудь когда-нибудь имел дело с этой проблемой раньше? Я также могу проверить, будет ли пароль одинаковым, но это будет таможенная вещь.
Спасибо.
Решение
Если вы настроили свое приложение со стандартными компонентами, сценарий должен быть следующим:
При заправе пользователя приема
Authentication
Объект создается и заполняется именем пользователя и паролем, поставляемым пользователем.Пользовательские данные извлекаются: если это возможно,
UserCache
используется для извлечения ранее кэшированных деталей пользователей (т.е.getUserFromCache
называется либо по реализациямUserDetailsService
илиAuthenticationProvider
до призыв кAuthenticationManager
выполняется). И это 100% хорошо, что детали пользователей из кэша будут приходить с хорошим паролем.После проведения основных проверок предварительной аутентификации (истечение учетных данных и т. Д.) Наступает фактическая аутентификация. В этот момент пароль из кэшированных пользовательских деталей по сравнению с паролем, хранящимся в
Authentication
Поставляемый объект (который в настоящее время содержит неправильный пароль). В этот момент попытка аутентификации не удается.
Однако, если вы реализуете твой собственный AuthenticationProvider
или AuthenticationManager
, Вы несете ответственность за проверку паролем.
Другие советы
Какой код изначально получает пользователя из БД и кэширует его? Проверяет ли это пароль? Похоже, у вас есть выпуск абстракции - Spring Security не должен знать, где пользователь исходит (дБ или кеш) и должен использовать одну и ту же логику в любом случае.