Cara Mengesahkan Pengguna Secara Manual dengan Keselamatan Spring

1. Gambaran keseluruhan

Dalam artikel ringkas ini, kami akan memfokuskan pada cara menetapkan pengguna yang disahkan secara terprogram di Spring Security dan Spring MVC.

2. Keselamatan Musim Bunga

Secara sederhana , Spring Security menyimpan maklumat utama setiap pengguna yang disahkan dalam ThreadLocal - diwakili sebagai objek Pengesahan .

Untuk membina dan menetapkan objek Pengesahan ini - kita perlu menggunakan pendekatan yang sama dengan Spring Security yang biasanya digunakan untuk membina objek pada pengesahan standard.

Untuk, mari kita mencetuskan pengesahan secara manual dan kemudian menetapkan objek Pengesahan yang dihasilkan ke dalam SecurityContext semasa yang digunakan oleh kerangka untuk menahan pengguna yang sedang log masuk:

UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass); Authentication auth = authManager.authenticate(authReq); SecurityContext sc = SecurityContextHolder.getContext(); sc.setAuthentication(auth);

Setelah menetapkan Pengesahan dalam konteks, kami sekarang dapat memeriksa apakah pengguna semasa disahkan - menggunakan securityContext.getAuthentication (). IsAuthenticated () .

3. Spring MVC

Secara lalai, Spring Security menambahkan penapis tambahan dalam rantai penapis Spring Security - yang mampu bertahan dalam Konteks Keselamatan ( kelas SecurityContextPersistenceFilter ).

Pada gilirannya, ia mewakilkan kegigihan Konteks Keamanan ke contoh SecurityContextRepository , secara lalai ke kelas HttpSessionSecurityContextRepository .

Oleh itu, untuk menetapkan pengesahan pada permintaan dan oleh itu, menyediakannya untuk semua permintaan berikutnya dari klien , kami perlu menetapkan SecurityContext yang berisi Pengesahan secara manual dalam sesi HTTP:

public void login(HttpServletRequest req, String user, String pass) { UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass); Authentication auth = authManager.authenticate(authReq); SecurityContext sc = SecurityContextHolder.getContext(); sc.setAuthentication(auth); HttpSession session = req.getSession(true); session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, sc); }

SPRING_SECURITY_CONTEXT_KEY ialah statik diimport HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY .

Perlu diingatkan bahawa kita tidak boleh menggunakan HttpSessionSecurityContextRepository secara langsung - kerana ia berfungsi bersamaan dengan SecurityContextPersistenceFilter.

Itu kerana penapis menggunakan repositori untuk memuat dan menyimpan konteks keselamatan sebelum dan sesudah pelaksanaan sisa penapis yang ditentukan dalam rantai, tetapi menggunakan pembungkus khusus atas tindak balas yang diteruskan ke rantai.

Oleh itu, dalam kes ini, anda harus mengetahui jenis kelas pembungkus yang digunakan dan meneruskannya ke kaedah simpan yang sesuai di repositori.

4. Kesimpulan

Dalam tutorial ringkas ini, kami membincangkan cara menetapkan Pengesahan pengguna secara manual dalam konteks Spring Security dan bagaimana ia dapat disediakan untuk tujuan Spring MVC, dengan memfokuskan pada contoh kod yang menggambarkan cara termudah untuk mencapainya.

Seperti biasa, sampel kod boleh didapati di GitHub.