Perusahaan saya telah mengevaluasi Spring MVC untuk menentukan apakah kami harus menggunakannya di salah satu proyek kami berikutnya. Sejauh ini saya menyukai apa yang saya lihat, dan sekarang saya melihat pada modul Spring Security untuk menentukan apakah itu sesuatu yang bisa / harus kita gunakan.
Persyaratan keamanan kami sangat mendasar; pengguna hanya perlu dapat memberikan nama pengguna dan kata sandi untuk dapat mengakses bagian-bagian tertentu dari situs (seperti untuk mendapatkan info tentang akun mereka); dan ada beberapa halaman di situs (FAQ, Dukungan, dll) di mana pengguna anonim harus diberi akses.
Dalam prototipe yang saya buat, saya telah menyimpan objek "LoginCredentials" (yang hanya berisi nama pengguna dan kata sandi) di Session untuk pengguna yang diautentikasi; beberapa pengendali memeriksa untuk melihat apakah objek ini dalam sesi untuk mendapatkan referensi ke nama pengguna yang masuk, misalnya. Saya ingin mengganti logika buatan sendiri ini dengan Spring Security, yang akan bermanfaat untuk menghapus segala jenis "bagaimana cara melacak pengguna yang masuk?" dan "bagaimana kami mengautentikasi pengguna?" dari controller / kode bisnis saya.
Sepertinya Spring Security menyediakan objek "konteks" (per-utas) untuk dapat mengakses info nama pengguna / utama dari mana saja di aplikasi Anda ...
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
... yang tampaknya sangat tidak Spring seperti objek ini adalah singleton (global).
Pertanyaan saya adalah ini: jika ini adalah cara standar untuk mengakses informasi tentang pengguna terotentikasi di Spring Security, apa cara yang diterima untuk menyuntikkan objek Otentikasi ke dalam SecurityContext sehingga tersedia untuk pengujian unit saya ketika tes unit membutuhkan pengguna terautentikasi?
Apakah saya perlu menghubungkan ini dalam metode inisialisasi setiap test case?
protected void setUp() throws Exception {
...
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
...
}
Ini sepertinya terlalu bertele-tele. Apakah ada cara yang lebih mudah?
The SecurityContextHolder
obyek itu sendiri tampaknya sangat un-Spring-seperti ...