Я ищу для осуществления процедуры восстановления пароля с помощью плагина Acegi для Grails ... Google не удается мне ...Grails Acegi плагин потерял пароль
ответ
ИМХО это в настоящее время не входит плагин Acegi , Я добавил действие forgotPassword к LoginController:
def forgotPassword = {
if (params.username) {
User user = User.findByUsername(params.username)
if (user) {
def password = randomService.generateRandomString(8)
user.passwd = authenticateService.encodePassword(password)
if (!user.save(flush:true)) {
user.errors.each {
log.error "err $it"
}
flash.message = message(code: "LoginController.msg.forgot.error")
} else {
sendMail {
to user.username
subject message(code:"LoginController.mail.forgot.subject")
body(view:"forgotPasswordEmail", model: [person:user, password:password])
}
flash.message = message(code:"LoginController.msg.forgot", args:[user.username])
}
} else {
flash.message = message(code:"LoginController.msg.forgot.unknown", args:[params.username])
}
}
}
Код выше использует почтовый плагин Grails.
Google терпит неудачу, потому что его нет. Невозможно отменить хешированный пароль (без взлома грубой силы и радужных таблиц), и если бы это было так, это означало бы, что ваша система не была безопасной.
Общая схема заключается в том, чтобы отправить по электронной почте пользователя, который забыли свой пароль с помощью одноразового использования, который они могут использовать для сброса пароля в любое удобное для них время. Это не встроено в фреймворк, но выполнять его не так уж сложно (я бы предложил использовать плагин grails mail).
Плагин Acegi не поддерживает это из коробки, но если вы добавите плагин email-confirmation, его можно легко свернуть самостоятельно.
Вот шаги:
Создать форму сброса пароля, который просит пользователя ввести свой адрес электронной почты и новый пароль.
Действия контроллера, которые обрабатывают форму сброса пароля, должны подтвердить данные, а использовать плагин подтверждения электронной почты, чтобы отправить электронное письмо пользователю с ссылкой для их нажатия, чтобы подтвердить смену пароля. Вы можете сделать это, вызвав следующий метод службы EmailConfirmationService, добавленной плагином.
def sendConfirmation(String emailAddress, String theSubject, Map model = null,
String userToken = null)
где:
emailAddress = address of user changing password
theSubject = subject of e-mail sent
model = any data passed to GSP that creates e-mail body
userToken = hashed user's password
, когда пользователь нажимает на ссылку в сообщении электронной почты (обратитесь к плагине документации для информации о том, как настроить эту электронную почту), в onConfirmation
закрытие будет вызвана услуга.
Это замыкание должно быть назначено в Bootstrap.groovy
так:
def emailConfirmationService
def init = { servletContext ->
emailConfirmationService.onConfirmation = { email, hashedPassword ->
User user = User.findByEmail(email)
user.passwd = hashedPassword
if (!user.save()) {
// Handle this error, somehow....
}
// Then return a map which will redirect the user to the login screen (for example)
[controller:'userProfile', action:'login']
}
}
Обратите внимание, что адрес электронной почты пользователя и хэшируются пароль передаются в этом закрытии, что позволяет восстановить и сохранить пароль пользователя.
Это хорошая начальная реализация. Одна из потенциальных проблем заключается в том, что он автоматически сбрасывает пароль, даже если кто-то еще его просил, поэтому существует вероятность того, что злоумышленник сможет постоянно «сбросить пароль» и изменить пароль пользователя без необходимости их изменения (хотя они, d все равно получите электронное письмо). Мы сделали что-то подобное, но вместо этого стол столкнулся с одноразовыми токенами с коротким временем жизни, которые отправляются по электронной почте для сброса пароля. Если токен не используется, пароль не изменяется. Только один токен в таблице на пользователя максимум. –
Полностью согласовано. Другой вариант - это вопрос безопасности, который, например, веб-сайты, например, «Какая девичья фамилия вашей матери?». Только если на вопрос ответят правильно, пароль будет сброшен. Возможно, было бы разумно отбросить функции обработки аккаунта «восстановить пароль», «восстановить имя пользователя», «удалить учетную запись» в отдельном плагине, который зависит от плагина acegi. –