“记住我”选项 - 我该如何实现它?

时间:2013-03-01 14:24:26

标签: ruby authentication sinatra

我的Sinatra应用程序中有一个简单的身份验证系统。当用户输入正确的登录名和密码时,它基本上将session[:user_id]设置为用户的id。现在足够,我不会使用其他解决方案。

我需要做的是“记住我”选项。那么我怎样才能为我的简单解决方案做到这一点?我无法理解。

2 个答案:

答案 0 :(得分:5)

我这样做的方式就是这个(我们使用OmniAuth进行身份验证,使用Mongoid进行用户存储 - 登录表单使用AJAX,因此回复是JSON)。与“记住我”复选框对应的HTML字段称为“记住”:

post '/auth/identity/callback' do
  u = User.find(env['omniauth.auth']['uid'])
  session[:user] = u
  session.options[:expire_after] = 2592000 unless params['remember'].nil? # 30 days
  [200, {:msg => 'User logged in'}.to_json]
end

这里的关键是sessions.options[:expire_after]行。如果未设置:expire_after,则在浏览器退出时将自动删除cookie。设置完成后,cookie会在浏览器重新启动时保持不变,并保持指定的秒数。

答案 1 :(得分:0)

你可以利用Sinatra Cookies。也许检查'remember_me'参数并将用户ID分配给cookie(如果存在)。例如,这是一个Rails示例,但内涵是相同的:

def login_user
    begin
      @user = User.authenticate(params)
      if @user
        if params[:remeberme] 
          cookies.permanent[:user_id] =  @user.id.to_s
        else
          cookies[:user_id] = @user.id.to_s
        end
      end
    rescue Exception => e
      @errors = [e]
    end
  end

Sinatra Cookies