Saya membuat aplikasi web dengan Spring Security yang akan tersedia di Amazon EC2 dan menggunakan Elastic Load Balancers Amazon. Sayangnya, ELB tidak mendukung sesi lengket, jadi saya perlu memastikan aplikasi saya berfungsi dengan baik tanpa sesi.
Sejauh ini, saya telah menyiapkan RememberMeServices untuk menetapkan token melalui cookie, dan ini berfungsi dengan baik, tetapi saya ingin cookie itu kedaluwarsa dengan sesi browser (mis. Saat browser ditutup).
Saya harus membayangkan saya bukan orang pertama yang ingin menggunakan Keamanan Musim Semi tanpa sesi ... ada saran?
spring
spring-security
load-balancing
amazon-ec2
Jarrod Carlson
sumber
sumber
Tampaknya menjadi lebih mudah di Spring Securitiy 3.0. Jika Anda menggunakan konfigurasi namespace, Anda cukup melakukan hal berikut:
Atau Anda dapat mengonfigurasi SecurityContextRepository sebagai null, dan tidak ada yang bisa disimpan dengan cara itu juga .
sumber
Kami menangani masalah yang sama (memasukkan SecurityContextRepository kustom ke SecurityContextPersistenceFilter) selama 4-5 jam hari ini. Akhirnya, kami menemukan jawabannya. Pertama-tama, di bagian 8.3 dari Keamanan Musim Semi ref. doc, ada definisi kacang SecurityContextPersistenceFilter
Dan setelah definisi ini, ada penjelasan berikut: "Alternatifnya, Anda dapat memberikan implementasi null dari antarmuka SecurityContextRepository, yang akan mencegah konteks keamanan disimpan, bahkan jika sesi telah dibuat selama permintaan."
Kami perlu memasukkan SecurityContextRepository kustom kami ke dalam SecurityContextPersistenceFilter. Jadi kami hanya mengubah definisi kacang di atas dengan impl kustom kami dan memasukkannya ke dalam konteks keamanan.
Saat kami menjalankan aplikasi, kami menelusuri log dan melihat bahwa SecurityContextPersistenceFilter tidak menggunakan impl kustom kami, melainkan menggunakan HttpSessionSecurityContextRepository.
Setelah beberapa hal lain yang kami coba, kami menemukan bahwa kami harus memberikan custom SecurityContextRepository impl kami dengan atribut "security-context-repository-ref" dari namespace "http". Jika Anda menggunakan namespace "http" dan ingin memasukkan impl SecurityContextRepository Anda sendiri, coba atribut "security-context-repository-ref".
Ketika namespace "http" digunakan, definisi SecurityContextPersistenceFilter yang terpisah diabaikan. Seperti yang saya salin di atas, dokumen referensi. tidak menyatakan itu.
Harap perbaiki saya jika saya salah paham.
sumber
Lihat
SecurityContextPersistenceFilter
kelas. Ini mendefinisikan bagaimanaSecurityContextHolder
penduduknya. Secara default digunakanHttpSessionSecurityContextRepository
untuk menyimpan konteks keamanan di sesi http.Mekanisme ini sudah saya implementasikan dengan cukup mudah, dengan custom
SecurityContextRepository
.Lihat di
securityContext.xml
bawah ini:sumber
Sebenarnya
create-session="never"
tidak berarti sepenuhnya tanpa kewarganegaraan. Ada masalah untuk itu dalam manajemen masalah Keamanan Musim Semi.sumber
Setelah berjuang dengan banyak solusi yang diposting dalam jawaban ini, untuk mencoba mendapatkan sesuatu yang berfungsi saat menggunakan
<http>
konfigurasi namespace, saya akhirnya menemukan pendekatan yang benar-benar berfungsi untuk kasus penggunaan saya. Saya sebenarnya tidak mengharuskan Spring Security tidak memulai sesi (karena saya menggunakan sesi di bagian lain aplikasi), hanya saja Spring Security tidak "mengingat" otentikasi dalam sesi sama sekali (harus diperiksa ulang setiap permintaan).Untuk memulainya, saya tidak dapat menemukan cara untuk melakukan teknik "implementasi nol" yang dijelaskan di atas. Tidak jelas apakah Anda harus menyetel securityContextRepository ke
null
atau ke implementasi tanpa operasi. Yang pertama tidak berfungsi karena aNullPointerException
terlempar ke dalamSecurityContextPersistenceFilter.doFilter()
. Sedangkan untuk implementasi tanpa operasi, saya mencoba menerapkan dengan cara yang paling sederhana yang dapat saya bayangkan:Ini tidak berfungsi di aplikasi saya, karena ada yang aneh
ClassCastException
denganresponse_
jenisnya.Bahkan dengan asumsi saya berhasil menemukan implementasi yang berfungsi (dengan tidak menyimpan konteks dalam sesi), masih ada masalah tentang bagaimana menyuntikkannya ke dalam filter yang dibangun oleh
<http>
konfigurasi. Anda tidak bisa begitu saja mengganti filter padaSECURITY_CONTEXT_FILTER
posisi tersebut, sesuai dengan dokumen . Satu-satunya cara saya menemukan untuk mengaitkanSecurityContextPersistenceFilter
yang dibuat di bawah sampul adalah dengan menulisApplicationContextAware
kacang jelek :Bagaimanapun, ke solusi yang benar-benar berfungsi, meskipun sangat hackish. Cukup gunakan
Filter
yang menghapus entri sesi yangHttpSessionSecurityContextRepository
dicari saat melakukan tugasnya:Kemudian di konfigurasi:
sumber
WebSecurityConfigurerAdapter
dengan "http.addFilterBefore(new SpringSecuritySessionDeletingFilter(), SecurityContextPersistenceFilter.class)
"Hanya catatan singkat: ini "sesi-buat" daripada "sesi-buat"
buat-sesi
Mengontrol keinginan pembuatan sesi HTTP.
Jika tidak disetel, defaultnya adalah "ifRequired". Pilihan lainnya adalah "selalu" dan "tidak pernah".
Setelan atribut ini memengaruhi properti allowSessionCreation dan forceEagerSessionCreation dari HttpSessionContextIntegrationFilter. allowSessionCreation akan selalu benar kecuali atribut ini disetel ke "tidak pernah". forceEagerSessionCreation adalah "false" kecuali jika disetel ke "selalu".
Jadi konfigurasi default memungkinkan pembuatan sesi tetapi tidak memaksanya. Pengecualiannya adalah jika kontrol sesi serentak diaktifkan, saat forceEagerSessionCreation akan disetel ke true, apa pun setelannya di sini. Menggunakan "tidak pernah" akan menyebabkan pengecualian selama inisialisasi HttpSessionContextIntegrationFilter.
Untuk detail spesifik dari penggunaan sesi, ada beberapa dokumentasi bagus di javadoc HttpSessionSecurityContextRepository.
sumber
auto-config=false
, Anda tampaknya tidak dapat mengganti apa yang ada diSECURITY_CONTEXT_FILTER
posisi dengan milik Anda. Saya telah meretas mencoba untuk menonaktifkannya dengan beberapaApplicationContextAware
kacang (menggunakan refleksi untuk memaksasecurityContextRepository
implementasi nolSessionManagementFilter
) tetapi tidak ada dadu. Dan sayangnya, saya tidak bisa beralih ke keamanan musim semi 3,1 tahun yang akan memberikancreate-session=stateless
.