我正在寻找使用Grails的Acegi插件实现密码检索程序...谷歌让我失望......
答案 0 :(得分: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邮件插件。
答案 1 :(得分:3)
常见的模式是通过一次性使用令牌向忘记密码的用户发送电子邮件,然后他们可以使用该令牌将密码重置为他们想要的密码。这不是内置于框架中,但手动操作并不困难(我建议使用grails邮件插件)。
答案 2 :(得分: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']
}
}
请注意,用户的电子邮件和散列密码会传递到此闭包中,使您可以重置并保存用户密码。