Как получить доступ к сеансу из Warden / Разработать обратный вызов after_authentication в Rails

#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