Реализация "Запомнить меня" в приложении Rails - программирование
Подтвердить что ты не робот

Реализация "Запомнить меня" в приложении Rails

У моего Rails-приложения есть окно с надписью "помнить меня". Пользователи, которые проверяют этот флажок, должны оставаться в системе даже после закрытия своего браузера. Я отслеживаю, зарегистрированы ли пользователи, сохраняя их идентификатор в сеансе пользователя.

Но сеансы реализованы в Rails как файлы cookie сеанса, которые не являются постоянными. Я могу сделать их упорными:

class ApplicationController < ActionController::Base
  before_filter :update_session_expiration_date

  private

  def update_session_expiration_date
    options = ActionController::Base.session_options
    unless options[:session_expires]
      options[:session_expires] = 1.year.from_now
    end
  end
end

Но это похоже на хак, что удивительно для таких общих функций. Есть ли лучший способ?

Edit

Ответ Gareth довольно хорош, но мне все равно нужен ответ от знакомого с Rails 2 (из-за этого уникального CookieSessionStore).

4b9b3361

Ответ 1

Я потратил некоторое время на размышление об этом и сделал некоторые выводы. Файлы cookie сеансов Rails являются защищенными от несанкционированного доступа по умолчанию, поэтому вам действительно не нужно беспокоиться о том, что cookie изменяется на стороне клиента.

Вот что я сделал:

  • Сессионный cookie установлен на долговечность (6 месяцев или около того).
  • Внутри хранилища сеансов
    • Дата "истекает", установленная для входа в систему + 24 часа.
    • идентификатор пользователя
    • Authenticated = true, поэтому я могу разрешить анонимные пользовательские сообщения (не опасные из-за защиты тампера)
  • Я добавляю в Application Controller файл before_filter, который проверяет часть "expires on" сессии.

Когда пользователь проверяет флажок "Запомнить меня", я просто установил дату сеанса [: expireson] для входа + 2 недели. Никто не может украсть файл cookie и оставаться навсегда навсегда или маскарад как другой пользователь, потому что cookie сеанса рельсов защищен от несанкционированного доступа.

Ответ 2

Вы почти наверняка не будете продлевать cookie сеанса, чтобы долго жить.

Несмотря на то, что речь идет не о рельсах в этой статье, вы найдете несколько примеров, чтобы объяснить лучшие методы "помни меня".

В резюме, хотя вы должны:

  • Добавьте дополнительный столбец в таблицу пользователя, чтобы принять большое случайное значение
  • Установите долгоживущий файл cookie на клиенте, который объединяет идентификатор пользователя и случайное значение
  • Когда начинается новый сеанс, проверьте наличие файла cookie id/value и выполните проверку подлинности нового пользователя, если они совпадают.

Автор также рекомендует недействить случайное значение и сбросить файл cookie при каждом входе в систему. Лично мне это не нравится, так как тогда вы не можете войти в сайт на двух компьютерах. Я хотел бы убедиться, что моя функция смены пароля также reset случайная величина блокирует сеансы на других машинах.

В качестве заключительной заметки советы, которые он дает для выполнения определенных функций (смена пароля/изменение электронной почты и т.д.), недоступные для автосинтетированных сеансов, заслуживают внимания, но редко встречаются в реальном мире.

Ответ 3

Я бы посоветовал вам либо взглянуть на подключаемый модуль RESTful_Authentication, который имеет реализацию этого, либо просто переключить вашу реализацию на использование RESTful Authentication_plugin. Существует хорошее объяснение того, как использовать этот подключаемый модуль в Railscasts:

railscasts # 67 restful_authentication

Вот ссылка на сам плагин

restful_authentication

Ответ 5

Это довольно хорошая рецензия на опыт одного парня, который создает 30-дневные постоянные сеансы.

ПРЕДУПРЕЖДЕНИЕ: сообщение в блоге с 2006 года

http://grahamglass.blogs.com/main/2006/05/rails_sessionsr.html

Ответ 6

Обратите внимание, что вы не хотите сохранять свою сессию, а только свою личность. Вы создадите для них новый сеанс, когда они вернутся на ваш сайт. Как правило, вы просто назначаете GUID пользователю, записываете его в свой файл cookie, а затем используете его, чтобы искать их, когда они возвращаются. Не используйте свое имя пользователя или идентификатор пользователя для токена, поскольку его можно легко догадаться и позволить хитроумным посетителям захватывать учетные записи других пользователей.

Ответ 7

Я бы пошел на Devise для блестящего решения для аутентификации для рельсов.

Ответ 8

Это помогло мне:

http://squarewheel.wordpress.com/2007/11/03/session-cookie-expiration-time-in-rails/

Теперь мои сеансы CookieStore истекают через две недели, после чего пользователь должен снова отправить свои учетные данные для повторного входа в систему еще две недели.

Баскиально, это так же просто, как:

  • включая один файл в каталоге vendor/plugins
  • установить значение истечения сеанса в контроллере приложения, используя только одну строку