2009-10-31 3 views

ответ

3

ИМХО это в настоящее время не входит плагин 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.

+2

Это хорошая начальная реализация. Одна из потенциальных проблем заключается в том, что он автоматически сбрасывает пароль, даже если кто-то еще его просил, поэтому существует вероятность того, что злоумышленник сможет постоянно «сбросить пароль» и изменить пароль пользователя без необходимости их изменения (хотя они, d все равно получите электронное письмо). Мы сделали что-то подобное, но вместо этого стол столкнулся с одноразовыми токенами с коротким временем жизни, которые отправляются по электронной почте для сброса пароля. Если токен не используется, пароль не изменяется. Только один токен в таблице на пользователя максимум. –

+0

Полностью согласовано. Другой вариант - это вопрос безопасности, который, например, веб-сайты, например, «Какая девичья фамилия вашей матери?». Только если на вопрос ответят правильно, пароль будет сброшен. Возможно, было бы разумно отбросить функции обработки аккаунта «восстановить пароль», «восстановить имя пользователя», «удалить учетную запись» в отдельном плагине, который зависит от плагина acegi. –

3

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

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

3

Плагин 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'] 
    } 
} 

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