2015-10-09 1 views
-1

Я читаю через this part on logins from a Flask tutorial. В этом примере автор сохраняет объект User на глобальном g.Должен ли я хранить зарегистрированные данные пользователя на `g` или на` session`?

Почему он это делает? Разве не имеет смысла хранить зарегистрированные данные пользователя на глобальном session? Не следует ли использовать session для хранения данных о зарегистрированном пользователе?

ответ

0

Нет, не имеет смысла делать то, что вы описываете. Flask-Login делает хранит информацию пользователя в сеансе: он хранит идентификатор пользователя, чтобы загрузить полного пользователя по каждому запросу.

Если вы только что сохранили пользовательские данные в сеансе, он будет не синхронизирован, если у пользователя было более двух сеансов браузера или что-то, что изменило данные пользователя, произошло вне пользовательского контроля.

Вы передаете экземпляр User функции Flask-Login login_user, и он будет хранить идентификатор пользователя в session. Когда поступит следующий запрос, он вызовет user_loader с этим сохраненным идентификатором, чтобы снова получить экземпляр пользователя. Экземпляр хранится в g на время запроса.

-1

Флажок-логин, по иронии судьбы, использует файлы cookie session с помощью системы безопасности Werkzeug.

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

Но давайте поместим session в контексте: его основная цель - просто отслеживать идентификацию пользователя. Как таковая, она должна быть простой ссылкой, а процедуры «Флакс-Вход» делают остальные, сохраняя все остальное в g.

Фактически, g является очень гибким способом, которым session никогда не может быть. Например, можно добавить к нему элементы. Не только g.User, но приложите g.company или g.current_pet экземпляров класса к нему. Я подозреваю, что добавление метода g.current_pet.rendered_picture_url() к session будет несколько сложным. :)

Использование g во многих отношениях также намного безопаснее. A session браузер cookie, мог бы, теоретически, использоваться другими актерами (например, вирусом), поскольку он хранится на компьютере пользователя. Или какой-либо другой кросс-сайтjavascriptобезьяна-бизнес. Объект g хранится в ОЗУ сервера, а не в браузере.

ОДНАКО, только что сказал все это. Бывают случаи, когда использование файлов cookie имеет больше смысла. Например, если части вашего веб-сайта не находятся в Flask, но бок о бок с другой структурой. Или если вы застряли, используя какой-то негибкий код, который требует увидеть значение в качестве файла cookie.

+0

Этот ответ не имеет смысла. 'session' - это интерфейс dict к файлу cookie (по умолчанию), постоянный по всем запросам. 'g' - пространство имен Python во время одного запроса. Эти два не эквивалентны, и нет понятия «безопасность» с 'g', это внутренний объект. Сеанс - это интерфейс, он не должен быть файлом cookie, но этот файл cookie подписан и привязан к домену, который его выпустил. Этот ответ содержит кучу запутанной дезинформации о логине, куки-файлах и безопасности. – davidism

+0

Почему иронично, что Flask-Login использует сеанс?Зачем говорить о потенциальных атаках javascript в вопросе о том, почему объект загружается в 'g' из' session'? – davidism

+0

Извините, что вы нашли мой формулировочный комплекс. Да, когда я говорю «cookie браузера сеанса», я имею в виду «сеанс (который использует) cookie браузера». Я ничего не знаю о сеансовом интерфейсе. Не могли бы вы предоставить ссылку? – JohnAD

Смежные вопросы

 Смежные вопросы