Spring Security - получение имени пользователя, который пытается войти

Мне нужно реализовать PasswordEncoder который генерирует соленые пароли. Соли зависят от пользователя (UUID) и хранятся в соответствующих объектах User .

Таким образом, мне нужен доступ либо непосредственно к User либо к объекту UserDetails который содержит ссылку. Очень легко получить, если у меня было имя пользователя, пытающегося войти в систему.

И в этом заключается проблема. Я не могу понять это.

Что касается SecurityContext , мы все еще имеем дело с anonymousUser .

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

Как получить имя пользователя, пытающегося войти в систему?

Буду очень признателен за помощь. :)

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

Всего 2 ответа


Вы не сможете сделать это только с помощью PasswordEncoder поскольку абстракция предполагает, что вы можете кодировать пароль, используя только текстовый пароль (или сравнивать, используя хешированный пароль). Однако, если вы используете собственный AuthenticationProvider (который вызывает PasswordEncoder ), у вас будет доступ к входящему объекту Authentication включая имя пользователя. Больше информации здесь .


Вызов PasswordEncoder.matches(...) осуществляется с помощью additionalAuthenticationChecks(...) DaoAuthenticationProvider additionalAuthenticationChecks(...) DaoAuthenticationProvider , который имеет доступ к значению имени пользователя ( principal ).

Если вам нужен доступ к этому, вам нужно DaoAuthenticationProvider подкласс DaoAuthenticationProvider и переопределить (заменить) метод, а также убедиться, что Spring использует ваш подкласс при настройке.


Есть идеи?

10000