Aplikasi Django kita memiliki persyaratan manajemen sesi berikut.
- Sesi berakhir saat pengguna menutup browser.
- Sesi berakhir setelah periode tidak aktif.
- Mendeteksi saat sesi berakhir karena tidak aktif dan menampilkan pesan yang sesuai kepada pengguna.
- Peringatkan pengguna tentang sesi yang akan datang berakhir beberapa menit sebelum akhir periode tidak aktif. Bersamaan dengan peringatan tersebut, berikan pengguna opsi untuk memperpanjang sesi mereka.
- Jika pengguna sedang mengerjakan aktivitas bisnis yang panjang dalam aplikasi yang tidak melibatkan permintaan yang dikirim ke server, sesi tidak boleh timeout.
Setelah membaca dokumentasi, kode Django dan beberapa kiriman blog yang berhubungan dengan ini, saya mendapatkan pendekatan implementasi berikut.
Persyaratan 1
Persyaratan ini mudah diterapkan dengan menyetel SESSION_EXPIRE_AT_BROWSER_CLOSE ke True.
Persyaratan 2
Saya telah melihat beberapa rekomendasi untuk menggunakan SESSION_COOKIE_AGE untuk mengatur periode berakhirnya sesi. Tetapi metode ini memiliki masalah berikut.
Sesi selalu berakhir di akhir SESSION_COOKIE_AGE meskipun pengguna aktif menggunakan aplikasi. (Ini dapat dicegah dengan menyetel sesi kedaluwarsa ke SESSION_COOKIE_AGE pada setiap permintaan menggunakan middleware khusus atau dengan menyimpan sesi pada setiap permintaan dengan menyetel SESSION_SAVE_EVERY_REQUEST ke true. Tetapi masalah selanjutnya tidak dapat dihindari karena penggunaan SESSION_COOKIE_AGE.)
Karena cara kerja cookie, SESSION_EXPIRE_AT_BROWSER_CLOSE dan SESSION_COOKIE_AGE sama-sama eksklusif, yaitu cookie kedaluwarsa pada penutupan browser atau pada waktu kedaluwarsa yang ditentukan. Jika SESSION_COOKIE_AGE digunakan dan pengguna menutup browser sebelum cookie kedaluwarsa, cookie dipertahankan dan membuka kembali browser akan mengizinkan pengguna (atau siapa pun) ke dalam sistem tanpa diautentikasi ulang.
Django hanya mengandalkan kuki yang ada untuk menentukan apakah sesi aktif. Itu tidak memeriksa tanggal kedaluwarsa sesi yang disimpan dengan sesi.
Metode berikut dapat digunakan untuk mengimplementasikan persyaratan ini dan untuk mengatasi masalah yang disebutkan di atas.
- Jangan setel SESSION_COOKIE_AGE.
- Setel tanggal kedaluwarsa sesi menjadi 'waktu saat ini + periode tidak aktif' pada setiap permintaan.
- Timpa process_request di SessionMiddleware dan periksa masa berakhir sesi. Buang sesi jika telah kedaluwarsa.
Persyaratan 3
Saat kami mendeteksi bahwa sesi telah kedaluwarsa (di SessionMiddleware kustom di atas), setel atribut pada permintaan untuk menunjukkan sesi berakhir. Atribut ini dapat digunakan untuk menampilkan pesan yang sesuai kepada pengguna.
Persyaratan 4
Gunakan JavaScript untuk mendeteksi ketidakaktifan pengguna, memberikan peringatan dan juga opsi untuk memperpanjang sesi. Jika pengguna ingin memperpanjang, kirim pulsa tetap ke server untuk memperpanjang sesi.
Persyaratan 5
Gunakan JavaScript untuk mendeteksi aktivitas pengguna (selama operasi bisnis yang panjang) dan mengirim pulsa tetap hidup ke server untuk mencegah sesi kedaluwarsa.
Pendekatan implementasi di atas tampak sangat rumit dan saya bertanya-tanya apakah mungkin ada metode yang lebih sederhana (terutama untuk Persyaratan 2).
Setiap wawasan akan sangat dihargai.
Jawaban:
Ini idenya ... Tutup sesi di browser dengan
SESSION_EXPIRE_AT_BROWSER_CLOSE
setelannya. Kemudian setel stempel waktu di sesi pada setiap permintaan seperti itu.dan tambahkan middleware untuk mendeteksi jika sesi telah kedaluwarsa. sesuatu seperti ini harus menangani seluruh proses ...
Kemudian Anda hanya perlu membuat beberapa url dan tampilan untuk mengembalikan data yang relevan ke panggilan ajax mengenai berakhirnya sesi.
saat pengguna memilih untuk "memperbarui" sesi, boleh dikatakan, yang harus Anda lakukan adalah menyetel
requeset.session['last_activity']
waktu saat ini lagiJelas sekali kode ini hanyalah permulaan ... tetapi akan membawa Anda ke jalur yang benar
sumber
if not request.is_ajax()
sepenuhnya aman. Tidak bisakah seseorang yang memegang sesi sebelum kedaluwarsa memalsukan / mengirim panggilan ajax dan menjaga sesi tetap berjalan?Saya cukup baru menggunakan Django.
Saya ingin membuat sesi kedaluwarsa jika pengguna yang login menutup browser atau dalam keadaan menganggur (waktu tunggu tidak aktif) untuk beberapa waktu. Ketika saya mencari tahu di Google, pertanyaan SOF ini muncul lebih dulu. Terima kasih untuk jawaban yang bagus, saya mencari sumber untuk memahami bagaimana middlewares bekerja selama siklus permintaan / tanggapan di Django. Itu sangat membantu.
Saya akan menerapkan middleware khusus ke dalam kode saya mengikuti jawaban teratas di sini. Tapi saya masih agak curiga karena jawaban terbaik disini sudah diedit tahun 2011. Saya meluangkan lebih banyak waktu untuk mencari sedikit dari hasil pencarian terbaru dan muncul dengan cara yang sederhana.
Saya tidak memeriksa browser lain kecuali chrome. 1. Sesi kedaluwarsa ketika saya menutup browser meskipun SESSION_COOKIE_AGE disetel. 2. Hanya ketika saya menganggur selama lebih dari 10 detik, sesi A berakhir. Terima kasih kepada SESSION_SAVE_EVERY_REQUEST, kapan pun Anda muncul permintaan baru, Sesi ini akan disimpan dan waktu tunggu pembaruan habis untuk kedaluwarsa
Untuk mengubah perilaku default ini, setel pengaturan SESSION_SAVE_EVERY_REQUEST ke True. Ketika disetel ke True, Django akan menyimpan sesi ke database pada setiap permintaan tunggal.
Perhatikan bahwa cookie sesi hanya dikirim ketika sesi telah dibuat atau dimodifikasi. Jika SESSION_SAVE_EVERY_REQUEST adalah True, cookie sesi akan dikirim pada setiap permintaan.
Demikian pula, bagian cookie sesi yang kedaluwarsa diperbarui setiap kali cookie sesi dikirim.
django manual 1.10
Saya hanya meninggalkan jawaban sehingga beberapa orang yang termasuk baru di Django seperti saya tidak menghabiskan banyak waktu untuk mencari solusi seperti yang saya lakukan.
sumber
django-session-security melakukan hal itu ...
... dengan persyaratan tambahan: jika server tidak merespons atau penyerang memutuskan koneksi internet: bagaimanapun juga itu harus kedaluwarsa.
Penolak: Saya memelihara aplikasi ini. Tapi saya sudah menonton utas ini untuk waktu yang sangat, sangat lama :)
sumber
Satu cara mudah untuk memenuhi persyaratan kedua Anda adalah dengan menyetel nilai SESSION_COOKIE_AGE di settings.py ke jumlah detik yang sesuai. Misalnya:
Namun, dengan hanya melakukan ini sesi akan berakhir setelah 10 menit terlepas dari apakah pengguna menunjukkan beberapa aktivitas atau tidak. Untuk mengatasi masalah ini, waktu kedaluwarsa dapat diperpanjang secara otomatis (untuk tambahan 10 menit lagi) setiap kali pengguna melakukan segala jenis permintaan dengan kalimat berikut:
sumber
SESSION_COOKIE_AGE
sudah cukup dan bahwa permintaan apa pun (mengirim cookie sesi) akan secara otomatis menyegarkan kadaluwarsa cookie sesi.Anda juga dapat menggunakan fungsi build in stackoverflow
sumber
Dalam permintaan pertama, Anda dapat mengatur masa berakhir sesi sebagai
Dan saat menggunakan access_key dan token,
sumber