我的Sinatra应用程序中有一个简单的身份验证系统。当用户输入正确的登录名和密码时,它基本上将session[:user_id]
设置为用户的id。现在足够,我不会使用其他解决方案。
我需要做的是“记住我”选项。那么我怎样才能为我的简单解决方案做到这一点?我无法理解。
答案 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