在尝试重构时如何使用'Has_secure_password'?

时间:2012-01-24 19:46:13

标签: ruby-on-rails-3 rspec authorization railstutorial.org

我正在尝试重构railstutorial授权机制。

我的rails版本是3.2.0,我使用的是ruby 1.9.3-p0和postrgresql 9.1。

到目前为止,我的测试正在通过尝试sigin失败,但成功登录失败。(原因是我必须重构旧的登录机制)

这是我的会话助手sign_in函数:

def sign_in(employee)
  cookies.permanent.signed[:remember_token] = [employee.id, employee.salt]
  self.current_employee = employee
end.

我立即看到sign_in函数的一个问题是has_secure_password已经处理加密和盐等...我的想法是,我可能应该使用password_digest而不是employee.salt,但也失败了。

我希望我的Cookie在两小时后过期。我在cookies下的api.rubyonrails.org找到了这个选项。

 cookies[:key] = {
                  value => "employee.id, employee.salt",
                  expires => 2.hours.from.now
                  }

我的另一个问题是has_secure_password已经有了一个authenticate方法,这意味着我不必在rails教程中使用员工模型中定义的身份验证定义(用户模型),但是我评论出来,我得到了一个标志:

NoMethodError: undefined method 'authenticate'

这是我的会话控制器创建动作:

def create
  employee = Employee.authenticate(params[:session][:email],
                                   params[:session][:password])
  if employee.nil?
    flash.now[:error] = "Invalid email/password combination."
    @title = "Sign in"
    render 'new'
   else
    sign_in employee
    redirect_back_or employee
   end
 end

似乎Employee.authenticate是个问题。

所以我基本上有三个问题,它们如下:

在rails指南中,我们经历了一个相当长的加密过程,并将salt等应用于员工密码。由于has_secure_password已经处理了这个问题,我会将哪些变量传递给我的函数或能够捕获加密密码的参数?

下一个问题与cookie的过期有关,以及我如何在sign_in函数中使用它?

最后,我如何使用authenticate方法,以便rails将其识别为真正的方法?

为了记录,我搜索了railsguide,api.rubyonrails.org以及其他与此类似的问题。当然,这只是指出我对这些原则的理解不足,但我正在学习,并且确实做好了方向。

感谢您与我分享的任何想法,建议或资源。

更新 我重新阅读了has_secure_password上的api,并且authenticate只接受一个参数,即一个未加密的密码......所以我有一些工作要做。

我仍然需要您提供的任何帮助或想法或建议......谢谢。

更新 我发现这篇文章涉及会话超时: http://madkingsmusings.blogspot.com/2011/05/session-timeouts-on-rails.html 我仍然在努力想看看我是否可以让它为我工作,但它是为轨道教程量身定做的。 至于其他问题,Michael Hartl正在忙着推出第二版Ruby on Rails教程,在那个版本中他将处理has_secure_password。

1 个答案:

答案 0 :(得分:0)

可以使用新版本的铁路指南。

对于第一个也是最后一个问题...您会发现身份验证非常简单。 在用户模型中:

has_secure_password

在SessionController中:

  def create
    user = User.find_by_email(params[:session][:email])
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_back_or user
    else
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end

在SessionsHelper中:

def sign_in(user)
  cookies[:remember_token] = user.remember_token
  current_user = user
end

应该很明显,但我甚至没想过在github上寻找代码。也许其他人会欣赏这个链接。 Here is Hartl's 2nd edition Sample_App source on github