3

我正在寻找使用 Grails 的 Acegi 插件来实现密码检索过程......谷歌让我失望了......

4

3 回答 3

3

恕我直言,这目前不是 Acegi 插件的一部分。我在 LoginController 中添加了一个 forgotPassword 操作:

    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 邮件插件。

于 2009-10-31T17:33:34.343 回答
3

谷歌让你失望是因为没有一个。确实不可能反转散列密码(没有暴力破解和彩虹表),如果是,那意味着您的系统不安全。

常见的模式是通过电子邮件向忘记密码的用户发送一次性使用令牌,然后他们可以使用该令牌将密码重置为他们想要的任何内容。这不是内置在框架中的,但手动操作并不难(我建议使用 grails 邮件插件)。

于 2009-10-31T17:35:50.227 回答
3

Acegi 插件不支持开箱即用,但如果您添加电子邮件确认插件,则很容易推出您自己的插件。

以下是步骤:

创建一个密码重置表单,要求用户输入他们的电子邮件地址和新密码。

处理密码重置表单的控制器操作应验证数据并使用电子邮件确认插件向用户发送一封电子邮件,其中包含一个链接,供他们单击以确认他们的密码更改。您可以通过在插件添加的 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'] 
  } 
}

请注意,用户的电子邮件和散列密码被传递到此闭包中,使您能够重置并保存用户的密码。

于 2010-01-31T17:56:31.710 回答