Сведения о вопросе

Fhohir

16:03, 1st July, 2020

Теги

ruby-on-rails   ruby   http    

Реализация функции "Remember me" в приложении Rails

Просмотров: 511   Ответов: 8

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

Но сеансы реализуются в 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 ).



  Сведения об ответе

appple

18:03, 1st July, 2020

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

Хотя эта статья не касается конкретно rails, она достаточно подробно объясняет 'remember me' лучших практик.

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

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

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

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


  Сведения об ответе

LIZA

18:03, 1st July, 2020

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

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

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

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


  Сведения об ответе

PAGE

18:03, 1st July, 2020

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

railscasts #67 restful_authentication

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

restful_authentication


  Сведения об ответе

ASSembler

18:03, 1st July, 2020

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

http://agilewebdevelopment.com/plugins/restful_authentication


  Сведения об ответе

lool

18:03, 1st July, 2020

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

WARNING: запись в блоге с 2006 года

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


  Сведения об ответе

padenie

18:03, 1st July, 2020

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


  Сведения об ответе

JUST___

18:03, 1st July, 2020

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


  Сведения об ответе

#hash

18:03, 1st July, 2020

Это сработало как заклинание для меня:

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

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться