Как правильно запустить сеанс с использованием файлов cookie, сохранить его и получить к нему доступ в приложении Sinatra с помощью сеансов Rack - PullRequest
2 голосов
/ 31 марта 2012

У меня есть приложение Sinatra, работающее на Heroku. Мне было очень трудно правильно настроить файлы 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 или что-то подобное. Главный вопрос, который у меня возникает, - как мне получить доступ к значению: user_id в файле cookie?

Наконец, выход.

post '/logout/?' do
  session.clear
end

Если бы вы, ребята, могли бы помочь мне со всем этим, это было бы замечательно! Заранее спасибо, и если вам нужна дополнительная информация, я буду рад предоставить.

Ответы [ 2 ]

3 голосов
/ 04 января 2013

Это намного проще, чем это. 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 голос
/ 01 апреля 2012

Вы можете просто попытаться установить его с помощью 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"

...

...