#ruby-on-rails #session #authentication #devise #warden
#ruby-on-rails #сеанс #аутентификация #разработать #warden
Вопрос:
Я пытаюсь получить доступ к текущему сеансу из обратного вызова Warden after_authenticate (выполняется под Devise) в Rails 3.
В верхней части моего контроллера приложений я хочу сделать что-то вроде:
Warden::Manager.after_authentication do |user,auth,opts|
user.associate_with_ids(session[:pending_ids])
end
Конечная цель — получить список идентификаторов записей, которые были сохранены в сеансе до регистрации, и связать их с моделью пользователя после входа.
Любая помощь будет высоко оценена.
Ответ №1:
«auth.session» получает / устанавливает данные в сеансовом ключе «warden.user.#{scope}.session«.
Предположим, вы сохранили pending_ids в своем приложении rails:
session[:pending_ids] = ...
и вы хотели получить доступ к хукуwarden, вы могли бы получить к нему доступ таким образом:
Warden::Manager.after_authentication do |user,auth,opts|
user.associate_with_ids(auth.env['rack.session'][:pending_ids])
end
Мне потребовалось некоторое время, чтобы выяснить это, поэтому я думаю, что это может кому-то помочь.
(первоначально взято из diegoscataglini.com/2012/02/09/383/manipulating-sessions-in-wardendevise , который теперь мертв).
Ответ №2:
Вы можете получить доступ к хранилищу сеансов через auth
:
Warden::Manager.after_authentication do |user,auth,opts|
user.associate_with_ids(auth.session[:pending_ids])
end
Комментарии:
1. Я обнаружил, что auth.session не работает. Он существует, но не совпадает с сеансом из контекста контроллера.
2. Когда я это делаю, я получаю неопределенную локальную переменную или метод `session’ для #<Class:0x007fa2cbfe6c60>
Ответ №3:
Вы также можете получить доступ к сеансу через auth.request.session
.
Итак, ваш пример будет:
Warden::Manager.after_authentication do |user,auth,opts|
user.associate_with_ids(auth.request.session[:pending_ids])
end
Ответ №4:
вы также можете найти весь сеанс из auth.raw_session