“Rails by Example”认证实现

时间:2011-07-07 22:26:55

标签: ruby-on-rails ruby-on-rails-3 session authentication cookies

在Michael Hart的书中,这段代码用于实现身份验证:

module SessionsHelper
def sign_in(user)
    cookies.permanent.signed[:remember_token] = [user.id, user.salt] #permanent
    # -alternatively-
    # cookies.signed[:remember_token]={
    #   :value => [user.id, user.salt],
    #   expires => some_time.from_now
    # }

    current_user = user
end

def current_user=(user)
    @current_user = user
end

def current_user
    return @current_user ||= user_from_remember_token
end

private
    def user_from_remember_token
        #passes array of length two as a parameter -- first slot contains ID,
        #second contains SALT for encryption
        User.authenticate_with_salt(*remember_token)
    end

    def remember_token
        #ensures return of a double array in the event that
        #cookies.signed[:remember_token] is nil.
        cookies.signed[:remember_token] || [nil,nil]
    end

    end

它的工作非常好,我可以登录无限的时间,也可以按照我的意愿在有限的时间内登录。 但它有一个缺点,cookie存储在客户端上,即使浏览器关闭它们也不会消失

现在我想知道,因为在浏览器关闭后rails会话被破坏了,我如何将它们和这里提供的cookie结合起来实现具有以下特征的身份验证:

- 如果用户登录,    数据应存储在会话中    因此,在用户关闭浏览器后,他们会记录

- 如果用户登录,则选中“记住我”复选框     他们的数据应该存储在一个有很长失效日期的cookie中

对此采取什么措施仍然安全而简单? 我在网上搜索,没有发现任何最近的内容(Rails 3) 可以引导我朝着正确的方向前进。 我正在考虑为会话和cookie创建2个单独的模块,并在控制器中触发它们各自的sign_in方法是否存在remember_me param,但这看起来有很多重复。

PS我没有调查任何身份验证宝石以提供此功能,我更喜欢自己实现它。

由于

0 个答案:

没有答案