我在Heroku上运行了一个Sinatra应用程序。我真的很难为我的用户正确设置cookie。我一直在查看示例和文档几天,似乎无法解决问题。我想让我的用户使用电子邮件和密码登录。如果登录成功,我想创建一个在一段时间后过期的cookie。我希望用户在关闭并重新打开浏览器或者将新代码推送到Heroku时仍然保持登录状态。我认为这只是cookie的正常使用,所以如果有人能帮助我实现它,我将非常感激。
以下是我想法的方式我应该设置帖子'/ login'路线。
post '/login/?' do
#do_login is a helper method which checks if the user's credentials are correct
if do_login
use Rack::Session::Cookie, :key => 'rack.session',
:domain => 'www.Feistie.com',
:path => '/',
:expire_after => 2592000,
:secret => 'a_30_character_key',
:user_id => params[:user_id]
end
end
即使这是正确的,我也不太明白。什么是:关键?我假设:域名应该像我一样设置到我的网站。怎么样:路径?为什么:路径设置为'/'?我有没有为我的Rack应用程序设置密钥的地方?我不清楚cookie安全性是如何工作的。我也不确定我是否可以像我一样添加:user_id到哈希。
然后下一部分是设置帮助程序“logged_in?”看看是否有人登录?
def logged_in?
!session.nil?
end
这可能是错的,但我想我会尝试。
我还需要能够检查当前用户的实际身份。我曾经通过session[:user_id] == @user.id
或类似的东西来做这件事。我的主要问题是如何访问cookie中的:user_id值?
最后退出。
post '/logout/?' do
session.clear
end
如果你们能让我跟上这一切,那就太棒了!提前致谢,如果您需要更多信息,我很乐意提供。
答案 0 :(得分:3)
这比那简单得多。 http://www.sinatrarb.com/faq.html#sessions
enable :sessions
post '/login/?' do
if do_login
session[:user_id] = params[:user_id]
end
end
post '/logout/?' do
session[:user_id] = nil
end
我通常会尝试将会话管理保留在get
,post
,before
等块中的业务逻辑中。您可以使用before
过滤器“登录”当前会话的用户。
before '*' do
set :user_id, session[:user_id]
end
这是完全可选的,但您可以在机架文件中添加任何cookie配置:
use Rack::Session::Cookie,
:key => 'rack.session',
:path => '/',
:expire_after => 14400, # In seconds
:secret => 'change_me'
答案 1 :(得分:1)
您可以尝试使用response
response.set_cookie "user_id", {:value => params['user_id'],
:expires => (Time.now + 52*7*24*60*60)}
您可以在
到期之前随时阅读request.cookies["user_id"]
删除Cookie
response.delete_cookie "user_id"
...