我正在尝试重构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。
答案 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