Реализация «Запомнить меня» в приложении Rails - PullRequest
52 голосов
/ 02 августа 2008

В моем 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).

Ответы [ 8 ]

28 голосов
/ 02 августа 2008

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

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

В целом, хотя вы должны:

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

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

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

12 голосов
/ 17 сентября 2008

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

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

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

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

10 голосов
/ 17 сентября 2008

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

railscasts # 67 restful_authentication

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

restful_authentication

5 голосов
/ 07 августа 2008

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

http://agilewebdevelopment.com/plugins/restful_authentication

4 голосов
/ 02 сентября 2008

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

4 голосов
/ 03 августа 2008

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

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

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

3 голосов
/ 16 января 2011

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

3 голосов
/ 20 сентября 2008

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

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

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

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

  1. включая один файл в каталоге vendor / plugins
  2. установить значение истечения сеанса в контроллере приложения, используя только одну строку
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...