В нашем приложении Django есть следующие требования к управлению сеансом.
- Сессии истекают, когда пользователь закрывает браузер.
- Сессии истекают после периода бездействия.
- Обнаружение, когда сеанс истекает из-за неактивности и отображает соответствующее сообщение пользователю.
- Предупреждать пользователей о предстоящем завершении сеанса за несколько минут до окончания периода бездействия. Наряду с предупреждением, предоставить пользователям возможность продлить сеанс.
- Если пользователь работает с длинной деловой активностью в приложении, которая не включает запросы, отправляемые на сервер, сеанс не должен истекать.
После прочтения документации, кода Django и некоторых сообщений в блоге, связанных с этим, я придумал следующий подход к реализации.
Требование 1
Это требование легко реализовать, установив для параметра SESSION_EXPIRE_AT_BROWSER_CLOSE значение True.
Требование 2
Я видел несколько рекомендаций по использованию SESSION_COOKIE_AGE для установки периода истечения срока действия сеанса. Но этот метод имеет следующие проблемы.
-
Сессия всегда заканчивается в конце SESSION_COOKIE_AGE, даже если пользователь активно использует приложение. (Этого можно предотвратить, установив время окончания сеанса на SESSION_COOKIE_AGE для каждого запроса с использованием специального промежуточного программного обеспечения или путем сохранения сеанса для каждого запроса, установив для параметра SESSION_SAVE_EVERY_REQUEST значение true. Но следующая проблема неизбежна из-за использования SESSION_COOKIE_AGE.)
-
Из-за того, как файлы cookie работают, SESSION_EXPIRE_AT_BROWSER_CLOSE и SESSION_COOKIE_AGE являются взаимоисключающими, т.е. файл cookie либо истекает, либо закрывается браузером или в указанное время истечения срока действия. Если используется SESSION_COOKIE_AGE, и пользователь закрывает браузер до истечения срока действия файла cookie, файл cookie сохраняется и повторное открытие браузера позволяет пользователю (или кому-либо еще) войти в систему без повторной аутентификации.
-
Django полагается только на присутствующий файл cookie, чтобы определить, активен ли сеанс. Он не проверяет дату окончания сеанса, хранящуюся в сеансе.
Для реализации этого требования и использования описанных выше проблем можно использовать следующий метод.
- Не устанавливайте SESSION_COOKIE_AGE.
- Установите дату истечения срока действия сеанса как "текущее время + период бездействия" для каждого запроса.
- Переопределите process_request в SessionMiddleware и проверьте срок действия сеанса. Отмените сеанс, если он истек.
Требование 3
Когда мы обнаруживаем, что сеанс истек (в пользовательском SessionMiddleware выше), установите атрибут в запросе, чтобы указать истечение сеанса. Этот атрибут может использоваться для отображения соответствующего сообщения пользователю.
Требование 4
Используйте JavaScript, чтобы обнаружить неактивность пользователя, предоставьте предупреждение, а также возможность продлить сеанс. Если пользователь хочет продлить действие, отправьте на сервер продолж. Импульс, чтобы продлить сеанс.
Требование 5
Используйте JavaScript для определения активности пользователя (во время длительной бизнес-операции) и отправки оставшихся импульсов на сервер, чтобы не допустить завершения сеанса.
Вышеупомянутый подход к внедрению кажется очень сложным, и мне было интересно, может ли быть более простой метод (особенно для требования 2).
Любые идеи будут высоко оценены.