Rails с сессиями ActiveRecord и Restful-аутентификацией: когда записывается таблица сессий? - PullRequest
1 голос
/ 25 мая 2009

Предупреждение: кое-что из этого может быть очень неправильным, поэтому, пожалуйста, дайте мне знать, если мои предположения неверны.

Вот что я пытаюсь сделать:

Я использую restful-аутентификацию для входа в систему. Однако, поскольку я использую flex / ruby_amf для своего пользовательского интерфейса, я должен отдельно аутентифицировать каждое соединение из flex.

Я решил сделать это, перенаправив экран входа на встроенную флэш-страницу, вставив идентификатор сеанса в качестве флэшвара. Приложение флэш-памяти отправляет идентификатор сеанса с каждым запросом, и фильтр «до» на всех соответствующих контроллерах проверяет, вошел ли пользователь, связанный с сеансом, идентифицированным идентификатором сеанса.

Я могу связать пользователя с сеансом, добавив столбец 'user_id' в таблицу сеансов и выполнив SQL-запрос типа "update session set set user_id ..." ", вызываемый из функции login.

Однако user_id обновляется только во второй раз, когда пользователь входит в систему. Небольшое расследование показало, что запись в таблице сессий еще не существует во время выполнения функции входа в систему.

Итак, если все до этого момента имеет смысл и соответствует передовым практикам и т. Д., Тогда мой вопрос:

В какой момент создается запись в таблице сеансов? Есть ли способ обновить объект сеанса в функции входа в систему и заставить rails записать user_id в базу данных для меня?

Поведение сеансов на рельсах для меня настоящая загадка. Буду признателен за любую помощь.

Спасибо.

1 Ответ

1 голос
/ 01 июня 2009

В Rails 2.3 сеанс сохраняется после того, как приложение Rack завершило свою обработку. В традиционных приложениях Rails это происходит после полной обработки запроса: до фильтров, действий контроллера, рендеринга представления и после фильтров. Посмотри в actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/session/abstract/id.rb.

Если подумать, это имеет смысл. Запись сеанса в его хранилище каждый раз, когда вы помещаете что-то в сеанс, повлечет за собой много дополнительных затрат.

Это Rails, так что, если вы хотите поэкспериментировать с ним, вы можете написать себе способ сохранить сеанс в любое время, когда захотите. Я не рекомендую это. В конечном итоге вам придется постоянно переделывать код по мере развития Rails.

Вы правы, что для ActiveRecord :: SessionStore одна строка сопоставляется с одной сессией. Столбец data является закодированной формой каждого объекта, который вы помещаете в сеанс. Каждый раз, когда приходит запрос, Rails должен воссоздавать сеанс, как он существовал, создавая новые экземпляры всех объектов, которые вы ранее в нем хранили.

...