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

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

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

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

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

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

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

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

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

Вы не можете посмотреть на текущий входящий HTTP-запрос?

akuma8 13.05.2019 17:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

Почему переопределить DaoAuthenticationProvider, а не AbstractUserDetailsAuthenticationProvider? Кажется, это проще всего сделать.

User1291 14.05.2019 09:35

@User1291 DaoAuthenticationProvider расширяет AbstractUserDetailsAuthenticationProvider

Andreas 14.05.2019 17:19

да, но он также использует PasswordEncoder повсюду, заставляя меня переопределять практически все. Не вижу в этом смысла.

User1291 14.05.2019 17:24

@ User1291 Дело в том, что вам нужно переопределить только один метод, поэтому нужно писать гораздо меньше кода.

Andreas 14.05.2019 17:26

Другие вопросы по теме

Не удается подключиться к серверу Eureka. Исключение: java.net.ConnectException: в соединении отказано: подключение
Автоматическая перезагрузка весеннего загрузочного приложения в докере при использовании spring-security
Подача одного канала подписки на публикацию из двух адаптеров JMS Inboundchannel?
Загрузить приложение/октет-поток (изображение JPG — Spring Multipart post Request)
Комбинация плагина Maven Exec, Spring и ojdbc7 предотвращает закрытие JVM
Как исправить исключение UnsatisfiedDependencyException при весенней загрузке с помощью приложения mongodb?
Могу ли я войти во внешний файл с помощью докера в весеннем java-приложении?
Как отсортировать ключ карты дерева, который является строкой, в соответствии с заданным набором компараторов в Java
Исключение в потоке «основной» org.springframework.beans.factory.NoSuchBeanDefinitionException: нет названного компонента
Есть ли способ использовать @Autowired одновременно во всех файлах репозитория?