Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6085
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Реализация функции "Remember me" в приложении Rails
В моем 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 ).
Вы почти наверняка не должны продлевать куки сессии, чтобы быть долгоживущим.
Хотя эта статья не касается конкретно rails, она достаточно подробно объясняет 'remember me' лучших практик.
В целом, хотя вы должны:
- Добавьте дополнительный столбец в пользовательскую таблицу, чтобы принять большое случайное значение
- Установите долговременный файл cookie на клиенте который объединяет идентификатор пользователя и случайное значение
- Когда начинается новый сеанс, проверьте наличие файла cookie id / value и аутентифицируйте нового пользователя, если они совпадают.
Автор также рекомендует аннулировать случайное значение и сбрасывать куки при каждом входе в систему. Лично мне это не нравится, так как вы тогда не можете оставаться зарегистрированным на сайте на двух компьютерах. Я бы хотел убедиться, что моя функция смены пароля также сбрасывает случайное значение, таким образом блокируя сеансы на других машинах.
В качестве заключительного замечания, совет, который он дает по поводу того, чтобы сделать некоторые функции (изменение пароля/email change etc) недоступными для сеансов автоматической аутентификации, вполне заслуживает внимания, но редко встречается в реальном мире.
Я долго размышлял над этим и пришел к некоторым выводам. Rails сеансовые файлы cookie по умолчанию защищены от несанкционированного доступа, поэтому вам действительно не нужно беспокоиться о том, что файл cookie будет изменен на клиентском конце.
Вот что я сделал:
- Сеансовые файлы cookie рассчитаны на длительный срок (около 6 месяцев)
- Внутри хранилища сеансов
- Дата 'expires on', установленная для входа в систему + 24 часа
- идентификатор пользователя
- Authenticated = true, поэтому я могу разрешить анонимные сеансы пользователей (не опасные из-за защиты от несанкционированного доступа к файлам cookie)
- Я добавляю before_filter в контроллер приложения, который проверяет 'expires on' часть сеанса.
Когда пользователь ставит галочку в поле "Remember Me", я просто устанавливаю дату session[:expireson] как login + 2 недели. Никто не может украсть файл cookie и остаться в системе навсегда или замаскироваться под другого пользователя, потому что файл rails сеанса защищен от несанкционированного доступа.
Я бы предложил вам либо взглянуть на плагин RESTful_Authentication, который имеет реализацию этого, либо просто переключить вашу реализацию на использование RESTful Authentication_plugin. Существует хорошее объяснение о том, как использовать этот плагин в Railscasts:
railscasts #67 restful_authentication
Вот ссылка на сам плагин
Плагин restful_authentication имеет хорошую реализацию этого:
http://agilewebdevelopment.com/plugins/restful_authentication
Это довольно хорошая запись опыта одного парня по созданию 30-дневных постоянных сессий.
WARNING: запись в блоге с 2006 года
http://grahamglass.blogs.com/main/2006/05/rails_sessionsr.html
Обратите внимание, что вы не хотите сохранять их сеанс, просто их личность. Вы создадите для них новую сессию, когда они вернутся на ваш сайт. Как правило, вы просто назначаете пользователю GUID, записываете это в свой файл cookie, а затем используете его для поиска их, когда они возвращаются. Не используйте их логин или имя пользователя ID для токена, так как это может быть легко угадано и позволить хитрым посетителям захватить учетные записи других пользователей.
Это сработало как заклинание для меня:
http://squarewheel.wordpress.com/2007/11/03/session-cookie-expiration-time-in-rails/
Теперь мои CookieStore сеансы истекают через две недели, в результате чего пользователь должен повторно ввести свои учетные данные для входа в систему, чтобы быть постоянно зарегистрированным в течение еще двух недель.
В принципе, это так же просто, как:
- в том числе один файл в каталоге vendor/plugins
- установите значение срока действия сеанса в контроллере приложений, используя только одну строку