Spring Security userCache аннулирование - PullRequest
0 голосов
/ 05 января 2011

Использование Spring Security У меня есть DaoAuthenticationProvider, описанный здесь:

http://static.springsource.org/spring-security/site/docs/2.0.x/reference/dao-provider.html

У меня также есть кеширование (также как это описано в этой статье).

Проблема в том, что когда приходит запрос с хорошим именем пользователя (которое уже находится в кэше), но с неверным паролем - он возвращает пользователя из кэша, как если бы это было хорошее имя пользователя / пароль. Поскольку в качестве ключа используется имя пользователя, пароль вообще не используется.

Точный код, который возвращает пользователя из кэша:

UserDetails user = this.userCache.getUserFromCache(username);

Кто-нибудь когда-нибудь имел дело с этой проблемой раньше? Я также могу проверить, совпадает ли пароль, но это будет обычная вещь.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 06 января 2011

Если вы настроили ваше приложение со стандартными компонентами, сценарий должен быть следующим:

  1. При поступлении запроса пользователя объект Authentication создается и заполняется с использованием имени пользователя и пароля.по пользователю.

  2. Данные пользователя извлекаются: если это возможно, UserCache используется для извлечения ранее кэшированных данных пользователя (т. е. getUserFromCache вызывается реализациями UserDetailsService илиAuthenticationProvider до вызов AuthenticationManager выполнен).И все на 100% нормально, что данные пользователя из кеша будут поставляться с надежным паролем.

  3. После базовой предварительной проверки подлинности (истечение срока действия учетных данных и т. Д.) Происходит настоящая проверка подлинности.На этом этапе пароль из кэшированных данных пользователя сравнивается с паролем, хранящимся в предоставленном объекте Authentication (который в настоящее время содержит неверный пароль).На этом этапе попытка аутентификации завершается неудачей.

Однако, если вы внедрите свой AuthenticationProvider или AuthenticationManager, вы несете ответственность за проверку пароля.

0 голосов
/ 05 января 2011

Какой код изначально получает пользователя из БД и кэширует его? Проверяет ли пароль? Похоже, у вас проблема с абстракцией - Spring Security не должна знать, откуда приходит пользователь (DB или Cache), и должна использовать ту же логику в любом случае.

...