Djangoアプリケーションには次のセッション管理要件があります。
- ユーザーがブラウザを閉じるとセッションが期限切れになります。
- 非アクティブな期間が経過するとセッションが期限切れになります。
- 非アクティブが原因でセッションが期限切れになることを検出し、ユーザーに適切なメッセージを表示します。
- 非アクティブ期間が終了する数分前に、セッションの期限切れが差し迫っていることをユーザーに警告します。警告とともに、セッションを延長するオプションをユーザーに提供します。
- ユーザーがサーバーへのリクエストの送信を伴わない、アプリ内での長いビジネスアクティビティに取り組んでいる場合、セッションはタイムアウトしてはなりません。 。
ドキュメント、Djangoコード、およびこれに関連するいくつかのブログ投稿を読んだ後、次の実装アプローチを考え出しました。
要件1< / strong>
この要件は、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を設定しないでください。
- すべてのリクエストで、セッションの有効期限を「現在の時刻+非アクティブ期間」に設定します。
- SessionMiddlewareでprocess_requestをオーバーライドします。セッションの有効期限を確認します。有効期限が切れている場合はセッションを破棄します。
要件3
セッションの有効期限が切れたことを検出したとき(カスタムSessionMiddleware内)上記)、セッションの有効期限を示す属性をリクエストに設定します。この属性を使用して、ユーザーに適切なメッセージを表示できます。
要件4
JavaScriptを使用してユーザーの非アクティブを検出し、警告とセッションを延長するオプションを提供します。ユーザーが延長を希望する場合は、サーバーにキープアライブパルスを送信してセッションを延長します。
要件t 5
JavaScriptを使用してユーザーアクティビティを検出し(長期的なビジネスオペレーション中)、セッションの期限切れを防ぐためにサーバーにキープアライブパルスを送信します。
上記の実装アプローチ非常に手の込んだようで、もっと簡単な方法があるのではないかと思っていました(特に要件2の場合)。
どんな洞察も高く評価されます。