Ruby on rails 访问用户密码:Rails中的变量范围

Ruby on rails 访问用户密码:Rails中的变量范围,ruby-on-rails,ruby,variables,scope,restful-authentication,Ruby On Rails,Ruby,Variables,Scope,Restful Authentication,我正在为Rails应用程序编写一个非常简单的邮件系统。我正在使用RESTful身份验证。 这是一个相当传统的设置,当用户注册和忘记密码时,我会发送相同的电子邮件。 我只是有一个问题,我似乎无法解决 我希望对这两个实例使用相同的电子邮件模板,即使“新用户”电子邮件将来自用户控制器,“忘记密码”电子邮件将来自密码控制器 该电子邮件看起来像这样: <%=h @user.name %>, Your membership details: Username: <%=h @user.lo

我正在为Rails应用程序编写一个非常简单的邮件系统。我正在使用RESTful身份验证。 这是一个相当传统的设置,当用户注册和忘记密码时,我会发送相同的电子邮件。 我只是有一个问题,我似乎无法解决

我希望对这两个实例使用相同的电子邮件模板,即使“新用户”电子邮件将来自用户控制器,“忘记密码”电子邮件将来自密码控制器

该电子邮件看起来像这样:

<%=h @user.name %>, 
Your membership details:
Username: <%=h @user.login %>
Password: <%=h @user.password %>
不幸的是,当尝试使用此模板从密码控制器发送“忘记密码”电子邮件时,一切都会中断。 但让我困惑的是,它只是有点断裂:

  Bryan,
  Your membership details:
  Username: bryan
  Password: 
换句话说,@user.name仍然有效,正如@user.login一样。但由于某种原因,在这种状态下@user.password无法通过


感谢您的回复。要明确的是,在这种情况下,安全性确实不是问题,因此,能够以纯文本形式发送忘记的密码比通过重置密码过程要好,但我确实理解通常情况并非如此。

我猜密码是以散列形式存储的,故意让你不知道用户的密码。当用户忘记密码时,您需要做的是向用户发送一个链接,该链接仅在几天内有效,这将允许用户在不知道旧密码的情况下重置密码。

很难说没有看到您的一些代码,特别是控制器方法

虽然注册电子邮件可能在加密之前使用了密码。未加密的密码通常对以后的操作不可用,因为它被加密存储在数据库中

但是,如果您的密码控制器正在设置新密码,而不是试图检索旧密码,那么问题很可能出现在其他地方


不管怎么说,这是在不看代码的情况下所能做的最多的推测。

如果你查看数据库,你会看到一个密码散列和一个salt散列

在将明文密码存储到数据库之前,您必须将明文密码存储在另一个变量中,使用单独的变量和明文密码,您可以将其传递到ActiveMailer,并在电子邮件中不加密的情况下发送

@user = User.find(params[:id])
password = params[:user][:password]
options = {
    :password => password,
    :user => @user
}

if @user.update_attributes(params[:user]) and Mailer.deliver_reset(options)
    flash[:notice] = "Check your email (#{@user.email}) for your new password."
    redirect_to_back_or_default('/')
else
    flash[:error] = "Look at the errors below"
end

我同意梅莎拉的观点。这是由于restfulauth存储密码的方式。通常,用户模型中的
attr\u accessor:password
为密码设置一个虚拟属性,然后在您注册时使用该属性。在注册阶段,用户对象的password属性将设置为something,但当您稍后检索用户记录时,password字段将为空


我不认为这是做事情的“最佳”方式,给他们发送一个链接,让他们可以重置密码,而不仅仅是他们原来的密码,因为如果他们忘记了一次,是什么阻止他们再次忘记密码?

不要这样做

许多用户在多个地方使用相同的密码(是的,用户不应该,但他们确实如此)。以明文形式存储他们的密码不仅会危及您网站的安全,还会危及其他网站用户的安全。甚至不要让我开始通过电子邮件发送明文密码

按照其他人的建议去做,使用密码重置系统,而不是“这是你的密码”系统。

-只需要足够长的时间来加密它并保存加密版本。正如其他人提到的那样,这是为了安全

既然你不太担心这个应用的安全性,我建议为每个用户生成一个唯一的令牌,并为他们提供一个用于登录的URL。推荐URL,因为“密码”(甚至是生成的)可能会让用户期望他们可以更改它。您可以向用户发送类似以下内容的电子邮件:

  Bryan,
  Your membership details:
  Username: bryan
  Password: password
 Bryan,
  Your membership details:
  Username: bryan
  Your url: http://domain.com/x7sjs0qn

您的用户可以点击该URL并自动登录。这样你就不会给用户机会给你一个他们可能在别处使用的密码,如果他们忘记了,你可以用纯文本发送电子邮件,而不会给他们的其他帐户带来任何风险。

是的。这个属性访问器:密码过去让我很困惑。我敢打赌这就是问题所在。+1因为明文密码或使用可逆“哈希”密码是最大的安全漏洞之一。这个应用程序的安全性确实不是问题,但我通常会同意。@Brian Woods——如果安全性不是问题,就不要要求用户提供密码。如果这是一个问题,请尊重它。说“安全不是问题,但我们将要求用户提供密码,因为他们中的许多人都会提供他们在其他地方使用过的密码”,这是不负责任的。@MarkusQ这是目光短浅的。如果它是我和几个朋友之间内部和非正式使用的应用程序呢?在这种情况下,会话存储和密码更多的是出于礼节而不是出于安全考虑,构建“重置密码”系统似乎有些过火。@Brian Woods——你对“短视”有一个奇怪的定义;通常,该术语用于您正在使用的推理类型(假设因为某个对象的范围有限,所以它始终是有限的)。它也没有解决真正的问题;您是否试图获取朋友的密码?如果安全性不是问题,请不要要求用户提供密码。如果这是一个问题,请尊重它。说“安全性不是问题,但我们会要求用户提供密码(而不是保护密码),因为他们中的很多人都会提供他们在其他地方使用的密码”,这是不负责任的。同意w/MarkusQ。如果您以明文形式存储密码,并且有人能够查看您的用户表,则此人可以访问您用户80%的电子邮件帐户。