Grails用のAcegiプラグインを使用したパスワード取得手順の実装を探しています...Googleは私を失敗させています...
3 に答える
IMHO これは現在、Acegi プラグインの一部ではありません。LoginController に forgetPassword アクションを追加しました。
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 があなたを失望させているのは、Google が存在しないからです。ハッシュ化されたパスワードを元に戻すことは (ブルート フォース クラックやレインボー テーブルなしでは) 不可能です。
一般的なパターンは、パスワードを忘れたユーザーに 1 回限りのトークンを電子メールで送信することです。これを使用して、パスワードを好きなようにリセットできます。これはフレームワークに組み込まれていませんが、手動で行うのはそれほど難しくありません (grails メール プラグインの使用をお勧めします)。
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']
}
}
ユーザーの電子メールとハッシュ化されたパスワードがこのクロージャーに渡され、ユーザーのパスワードをリセットして保存できることに注意してください。