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

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

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

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

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

редактировать

Ответ Гарета довольно хороший, но мне все равно хотелось бы получить ответ от кого-то, знакомого с Rails 2 (из-за его уникальности CookieSessionStore).

2.08.2008 12:56:58
8 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

12
16.09.2008 21:37:36
по умолчанию сеансовые куки-файлы Rails являются только сеансами браузера, и поэтому cookie удаляются при закрытии браузера. Как вы делаете первый шаг в своем решении, и какую версию Rails вы используете? «Файл cookie сеанса настроен на длительный срок (6 месяцев или около того)»
Nick 8.02.2012 02:08:08
Я изменил настройки по умолчанию, чтобы cookie-файл сеанса не был «только сеанс браузера». Этот ответ сформирован 4 года назад, и настройки / настройки по умолчанию могут не применяться к более новым версиям Rails.
Daniel Beardsley 1.03.2012 02:12:09

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

Хотя эта статья не имеет отношения к рельсам, она в некоторой степени объясняет лучшие практики «помни меня».

В итоге, хотя вы должны:

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

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

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

28
2.08.2008 16:10:42
Посмотрите на улучшение предлагаемой статьи на jaspan.com/improved_persistent_login_cookie_best_practice, которое добавляет концепцию «серии» для повышения безопасности. Также ваше описание не является точным: 1) автор вашей статьи предлагает таблицу сопоставления «один ко многим» между пользователем и cookie, чтобы избежать постоянного аннулирования вашего логина при переключении компьютеров (т. Е. Работы и дома) 2) аннулирования случайный файл cookie не приведет к тому, что вы описываете (проблема с двумя компьютерами)
cherouvim 14.04.2010 13:09:52
Этот ответ вводит в заблуждение. Постоянные сеансы безопасны, потому что подписанные куки, предоставляемые Rails, являются безопасными. Есть только одна причина использовать метод, предложенный в этом ответе, а именно «последнее замечание»: этот метод полезен для различения ручной и автоматической (с помощью cookie-файла «запомнить меня») аутентификации.
collimarco 22.07.2013 11:35:11
Я придумал решение, основанное на этом. Вместо того, чтобы полагаться на новый столбец, я вместо этого использую в Digest::SHA512.base64digest(user.password_digest)качестве своего токена. password_digestэто уже защищенное значение, но SHA512 защитит его еще больше. Затем я сохраняю user_id в сеансе на стороне сервера, так что мне приходится вычислять SHA512 только один раз за сеанс. Это будет недействительным, когда пароль будет изменен.
bradlis7 8.02.2017 18:31:08

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

railscasts # 67 restful_authentication

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

restful_authentication

10
27.01.2013 11:36:27

Плагин restful_authentication имеет хорошую реализацию этого:

http://agilewebdevelopment.com/plugins/restful_authentication

5
6.08.2008 21:30:25

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

4
1.09.2008 21:46:46

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

ВНИМАНИЕ: сообщение в блоге с 2006 года

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

4
2.07.2009 00:57:54

Для меня это сработало:

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

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

По сути, это так просто, как:

  1. включая один файл в каталоге vendor / plugins
  2. установить значение истечения сеанса в контроллере приложения, используя только одну строку
3
20.09.2008 08:58:47

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

3
16.01.2011 04:26:53