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

StackOverflow https://stackoverflow.com/questions/438

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

Вам почти наверняка не следует продлевать срок действия файла cookie сеанса.

Хоть и не занимаюсь конкретно рельсами Эта статья подробно объясняет лучшие практики «запомни меня».

Подводя итог, вы должны:

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

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

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

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

рельсы #67 restful_authentication

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

restful_authentication

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

http://agilewebdevelopment.com/plugins/restful_authentication

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

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

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

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

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

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

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

В принципе, это так же просто, как:

  1. включая один файл в каталоге поставщика/плагинов
  2. установите значение срока действия сеанса в контроллере приложения, используя всего одну строку

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top