Плагин Grails Acegi потерял пароль - PullRequest
3 голосов
/ 31 октября 2009

Я ищу реализацию процедуры извлечения пароля с использованием плагина Acegi для Grails ... Google подводит меня ...

Ответы [ 3 ]

3 голосов
/ 31 октября 2009

Google подводит вас, потому что его нет. На самом деле невозможно отменить хешированный пароль (без взлома методом перебора и радужных таблиц), и если бы это было так, это означало бы, что ваша система не была защищена.

Обычный шаблон - отправка электронной почты пользователю, который забыл свой пароль, с помощью одноразового токена, который он затем может использовать для сброса пароля к тому, что он хочет. Это не встроено в фреймворк, но это не так сложно сделать вручную (я бы посоветовал использовать почтовый плагин grails).

3 голосов
/ 31 января 2010

Плагин Acegi не поддерживает это "из коробки", но если вы добавите плагин email-подтверждение , вы легко сможете развернуть свой собственный.

Вот шаги:

Создайте форму для сброса пароля, в которой пользователю предлагается ввести свой адрес электронной почты и новый пароль.

Действие контроллера, которое обрабатывает форму сброса пароля, должно проверить данные и Используйте плагин подтверждения электронной почты, чтобы отправить электронное письмо пользователю со ссылкой, по которой он может щелкнуть, чтобы подтвердить изменение пароля. Это можно сделать, вызвав следующий метод в службе 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'] 
  } 
}

Обратите внимание, что электронная почта пользователя и хешированный пароль передаются в это закрытие, что позволяет вам сбросить и сохранить пароль пользователя.

3 голосов
/ 31 октября 2009

ИМХО, это в настоящее время не является частью плагина Acegi. Я добавил действие забытого пароля в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...