Реализация «Запомнить меня» в приложении Rails
-
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 имеет хорошую реализацию этого:
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 истекают через две недели, при этом пользователь должен снова ввести свои учетные данные для входа в систему, чтобы постоянно входить в систему в течение еще двух недель.
В принципе, это так же просто, как:
- включая один файл в каталоге поставщика/плагинов
- установите значение срока действия сеанса в контроллере приложения, используя всего одну строку
Я бы выбрал Devise как блестящее решение для аутентификации на рельсах.