Ruby on rails Rails设计:设置密码重置令牌并重定向用户

Ruby on rails Rails设计:设置密码重置令牌并重定向用户,ruby-on-rails,devise,login-control,Ruby On Rails,Devise,Login Control,在特定用例的应用程序中,我创建了一个新用户(以编程方式设置密码),并向他们发送确认电子邮件 我希望他们能够在确认后立即更改密码(无需输入我不想发送给他们的系统生成的密码) 实际上,我想要 1) 系统使用生成的密码创建新用户帐户。 2) 系统发送确认电子邮件。 3) 用户单击确认并被重定向以输入密码(有效地将其发送到如下URL) 任何帮助/提示都很好。一种简单的方法,用户只需一步即可确认电子邮件地址并使用您建议的链接设置初始密码 发送一个你的应用程序生成的电子邮件,包括一个ReSeTyPase

在特定用例的应用程序中,我创建了一个新用户(以编程方式设置密码),并向他们发送确认电子邮件

我希望他们能够在确认后立即更改密码(无需输入我不想发送给他们的系统生成的密码)

实际上,我想要
1) 系统使用生成的密码创建新用户帐户。
2) 系统发送确认电子邮件。
3) 用户单击确认并被重定向以输入密码(有效地将其发送到如下URL)



任何帮助/提示都很好。

一种简单的方法,用户只需一步即可确认电子邮件地址并使用您建议的链接设置初始密码

发送一个你的应用程序生成的电子邮件,包括一个ReSeTyPaseWordBy令牌,并考虑用户拥有该电子邮件地址有效性的令牌确认。

在系统帐户生成代码中,假设用户模型设置为:可恢复和:数据库可验证设计模块

acct=User.new
acct.password=User.reset_password#令牌#实际上不会被使用。。。
acct.reset\u password\u token=User.reset\u password\u token
acct.email=”user@usercompany.com“#假设用户会认同此字段
#设置您可能需要的其他帐户字段
帐户保存
当用户设置初始密码时,使Desive reset password视图更清晰

查看/设计/密码/edit.html.erb
。。。
...  
生成的电子邮件
Hi
已为您生成一个帐户。
请访问www.oursite.com/users/password/edit?initial=true&reset\u password\u token=设置密码。
无需在您的用户模型中包括:confirmable designe模块,因为如果没有电子邮件中的重置密码令牌,您的应用程序创建的帐户将无法访问

Desive将处理提交并清除重置密码令牌字段

请参见
designe\u gem\u folder/lib/designe/models/recoverable.rb
database\u authenticable.rb
了解有关方法和好友的详细信息


如果您想使用designe
:confirmatible
模块而不是此方法,请参阅Rails 4.1中的。

,以下是对Anatortoise House回复的修改:

user = User.new
user.password = SecureRandom.hex #some random unguessable string
raw_token, hashed_token = Devise.token_generator.generate(User, :reset_password_token)
user.reset_password_token = hashed_token
user.reset_password_sent_at = Time.now.utc
user.email = 'user@usercompany.com'
user.save!
# Use a mailer you've written, such as:
AccountMailer.set_password_notice(user, raw_token).deliver
“电子邮件”视图包含以下链接:

www.oursite.com/users/password/edit?initial=true&reset_password_token=<%= @raw_token %>
www.oursite.com/users/password/edit?initial=true&reset\u password\u令牌=
您可以拨打

user.send(:set_reset_password_token)
它可能不稳定,因为它是一种受保护的方法,但它可以适用于您的情况。用测试覆盖它


(在Desive v.3.4上测试)

这是我的邮件预览片段

class Devise::MailerPreview < ActionMailer::Preview
  def reset_password_instructions
    user = User.last
    token = user.send(:set_reset_password_token)
    Devise::Mailer.reset_password_instructions(user, token)
  end
end
classdevise::MailerPreview
非常感谢-我没有看到wiki,因为它刚刚创建。就像密码重置令牌自动被确认的想法一样。不错,这是很多rails应用程序的一个很好的工作流。我试图弄清楚我的应用程序如何启动密码重置(生成新令牌)。很好地记录了。顺便说一句,我还必须设置user.reset\u password\u sent\u。现在,否则密码链接“过期”,似乎
reset\u password\u token
。这意味着
User.reset\u password\u token
将在以后版本的designe中引起不稳定。我认为您可以通过
design.token\u generator.generate(User,:reset\u password\u token)
实现类似的功能,其中
User
是您的designe模型的名称。但更高兴的是,有一种更简洁的方法。这种方法是从哪里来的?我已经配置了一个从Deave::mailer继承的自定义邮件程序,但是如果要获得一个未找到的方法错误,您必须自己定义它,就像使用ActionMailer的任何其他普通外出电子邮件一样。从Deave版本3.5.1起,重置密码令牌将在任何更改电子邮件或密码的调用中清除。从Desive版本3.5.1开始,重置密码令牌将在任何同时更改用户电子邮件或密码的呼叫中清除,因此您需要在单独的user.save呼叫中设置重置密码令牌和重置密码发送值
user.send(:set_reset_password_token)
class Devise::MailerPreview < ActionMailer::Preview
  def reset_password_instructions
    user = User.last
    token = user.send(:set_reset_password_token)
    Devise::Mailer.reset_password_instructions(user, token)
  end
end