Руководство по внедрению spring восстановления пароля безопасности с динамическим URL-адресом, отправленным по электронной почте
Мне было очень сложно восстановить пароль, так как я никогда раньше этого не делал.
До сих пор у меня есть веб-приложение, которое имеет:
Spring Безопасность, где пароль правильно хэшируется, а роли пользователя реализованы и работают правильно.
Стратегия подсказывает исследование из stackoverflow:
- Пользователь нажимает кнопку забытого пароля, где он вводит свой адрес электронной почты.
- Динамическая ссылка отправляется на адрес электронной почты
- Пользователь открывает ссылку на адрес электронной почты
- Что перенаправляет его на пароль reset page
Что не известно:
- Как дать динамическую природу ссылок - методы поколений
- Ссылка имеет тайм-аут - некоторые вопросы были найдены здесь, но часто включают пользовательский обработчик или расширение для spring функций безопасности
- Методы сопоставления запросов для ответа на такую динамическую ссылку
- Временные методы хранения ссылок - база данных, сеанс и т.д.
Как вы можете видеть, список довольно серьезен для одного вопроса. Так что надеялся, что вы сможете предоставить справочные ресурсы, как это сделать шаг за шагом. Я был немного удивлен, что не мог найти этого в документации по безопасности spring. Спасибо.
Я студент, поэтому не знаю действительно лучших отраслевых практик для этого, особенно в контексте Java, поэтому я действительно надеюсь, что кто-то сможет помочь.
Ответы
Ответ 1
Проблема не имеет особого отношения к Spring безопасности. При условии, что вы знаете структуру пользовательской базы данных и используемого кодировщика паролей, она действительно просто реализует рабочий процесс, включающий доступ к данным, веб-контроллеры и отправку электронной почты. Ссылка должна содержать произвольную строку токена (например, использовать SecureRandom
и кодировщик base64), и она должна храниться в базе данных с идентификатором пользователя и временной меткой (для проверки окна, в котором эта ссылка действительна). Контроллер просто извлечет токен из входящего запроса, загрузит данные из базы данных с помощью токена. Он проверит метку времени и затем переадресует пользователя в форму ввода пароля. В зависимости от требований вы также можете захотеть, чтобы они также ответили на другие вопросы безопасности. Затем вы проверили и закодировали пароль и сохранили его в учетной записи, соответствующей идентификатору пользователя, хранящемуся в таблице ссылок reset. Было бы также целесообразно запустить пакетное задание для удаления устаревших ссылок из базы данных.
В плагине Grails Spring Security UI уже есть опция забыли пароль, которую вы можете использовать напрямую или использовать в качестве ссылки.
Ответ 2
Я реализовал проект JAVA для этого варианта использования. Он находится на GitHub, с открытым исходным кодом.
Есть объяснения для всего (и если что-то отсутствует - дайте мне знать...)
Посмотрите: https://github.com/OhadR/Authentication-Flows
Это клиентское веб-приложение, использующее auth-потоки, с README со всеми пояснениями. он направляет вам реализацию:
https://github.com/OhadR/oAuth2-sample/tree/master/authentication-flows