Мне нужно реализовать PasswordEncoder, который генерирует соленые пароли. Соли зависят от пользователя (UUID) и хранятся в соответствующих объектах User.
Таким образом, мне нужен доступ либо к User напрямую, либо к UserDetails объекту, который содержит ссылку. Очень легко получить, ЕСЛИ у меня было имя пользователя, пытающегося войти в систему.
И в этом заключается проблема. Кажется, я не могу его уловить.
Что касается SecurityContext, мы все еще имеем дело с anonymousUser.
Я знаю, что где-то должен лежать UsernamePasswordAuthenticationToken, но я не могу ввести его, так как это не фасоль. И чтобы определить bean-компонент-оболочку, содержащий его, мне нужно было бы выяснить, где его найти в первую очередь.
Как получить имя пользователя, пытающегося войти в систему?
Был бы очень признателен за помощь. :)
(Примечание: пожалуйста, не рекомендуйте мне «не делать этого» или переносить пароли и начинать использовать BCryptPasswordEncoder или что-то в этом роде. Это то, что мы бы очень подобно сделали в какой-то момент в будущем, но на время быть не разрешено.)




Вы не сможете сделать это только с помощью PasswordEncoder, поскольку абстракция предполагает, что вы можете закодировать пароль, используя только обычный текстовый пароль (или сравнить с использованием хешированного пароля). Однако, если вы используете пользовательский AuthenticationProvider (который вызывает PasswordEncoder), у вас будет доступ к входящему объекту Authentication, включая имя пользователя. Подробнее здесь.
Вызов PasswordEncoder.matches(...) выполняется методом additionalAuthenticationChecks(...)DaoAuthenticationProvider, который имеет доступ к значению имени пользователя (principal).
Если вам нужен доступ к этому, вам нужно создать подкласс DaoAuthenticationProvider и переопределить (заменить) метод, а также убедиться, что Spring использует ваш подкласс при настройке.
Почему переопределить DaoAuthenticationProvider, а не AbstractUserDetailsAuthenticationProvider? Кажется, это проще всего сделать.
@User1291 DaoAuthenticationProvider расширяет AbstractUserDetailsAuthenticationProvider
да, но он также использует PasswordEncoder повсюду, заставляя меня переопределять практически все. Не вижу в этом смысла.
@ User1291 Дело в том, что вам нужно переопределить только один метод, поэтому нужно писать гораздо меньше кода.
Вы не можете посмотреть на текущий входящий HTTP-запрос?