Dasar -dasar Cepatik Siprings
Dalam artikel sebelumnya "Penggunaan Dasar Springboot + Spring Security dan Konfigurasi Login yang Dipersonalisasi", SpringSecurity diperkenalkan secara singkat, pada dasarnya memperkenalkan antarmuka dan mengimplementasikan fungsinya. Artikel ini mencoba membuat analisis sederhana dari proses otentikasi pengguna dari perspektif kode sumber.
Sebelum analisis khusus, pertama -tama kita dapat melihat prinsip -prinsip umum SPRINGINGECIDE:
Dasar -dasar Cepatik Siprings
Bahkan, itu relatif sederhana, terutama melalui serangkaian filter untuk mencegat dan memproses permintaan.
Deskripsi proses pemrosesan sertifikasi
Mari kita lihat kelas UsernamePasswordAuthenticationFilter secara langsung.
Public Class UsernamepasswordAuthenticationFilter memperluas abstractAuthenticationProcessingFilter // Masuk untuk meminta otentikasi otentikasi otentikasi publik upaya otentikasi (httpservletRequest, tentukan apakah ini adalah permintaan (ini. {throw new AuthenticationServiceException ("Metode otentikasi tidak didukung:" + request.getMethod ()); } else {// Dapatkan pengguna, kata sandi string username = this.obtainusername (request); String password = this.obtainpassword (request); if (username == null) {username = ""; } if (password == null) {password = ""; } username = username.trim (); // menghasilkan token, usernamepasswordAuthenticationToken authrequest = UsernamepasswordAuthenticationToken baru (nama pengguna, kata sandi); this.setDetails (permintaan, authrequest); // Lebih lanjut verifikasi return this.getAuthenticationManager (). Otentikasi (authRequest); }}} Dalam metode attemptAuthentication , yang utama adalah mendapatkan nilai permintaan pengguna dan kata sandi, dan kemudian menghasilkan objek UserNamepasswordAuthenticationToken untuk verifikasi lebih lanjut.
Tapi pertama -tama kita dapat melihat metode konstruksi USERNAMEPASSWORDAuthenticationToken
UsernamepasswordAuthenticationToken publik (prinsip objek, kredensial objek) {// atur izin kosong super ((koleksi) null); this.principal = prinsipal; this.credentials = kredensial; // atur apakah this.setAuthenticated (false);} Faktanya, USERNAMEPASSWORDAuthenticationToken diwarisi dari Authentication . Objek ini disebutkan dalam artikel sebelumnya. Ini adalah parameter dalam metode panggilan balik login yang berhasil, yang berisi parameter seperti informasi pengguna, informasi permintaan, dll.
Jadi mari kita lihat
this.getAuthenticationManager (). Otentikasi (authRequest);
Ada AuthenticationManager di sini, tetapi panggilan sebenarnya adalah ProviderManager .
Public Class ProviderManager mengimplementasikan AuthenticationManager, MessageSourceAware, InitializingBean {Otentikasi Publik Otentikasi (Otentikasi Otentikasi) melempar AuthenticationException {class <? Extends Authentication> totest = authentication.getClass (); AuthenticationException LastException = null; Hasil otentikasi = null; boolean debug = logger.isdebugeNabled (); Iterator var6 = this.getProviders (). Iterator (); while (var6.hasnext ()) {AuthenticationProvider Provider = (AuthenticationProvider) var6.next (); // 1. Tentukan apakah ada penyedia untuk mendukung otentikasi jika (provider.supports (totest)) {// 2. Hasil penilaian logis sejati = provider.authenticate (otentikasi); }}} Otentikasi Otentikasi Publik (Otentikasi Otentikasi) melempar AuthenticationException {userDetails user = this.usercache.getUserFromCache (nama pengguna); if (user == null) {cacheWasused = false; // 1. Pergi untuk mendapatkan userDetails user = this.retrieveuser (nama pengguna, (usernamepasswordAuthenticationToken) otentikasi); } coba {// 2. Pra-periksa this.preAuthenticationChecks.Check (user); // 3. Pemeriksaan tambahan (pemeriksaan kata sandi) this.additionAlAuthenticationChecks (pengguna, (usernamepasswordAuthenticationToken) otentikasi); } catch (authenticationException var7) {} // 4. The Last check this.postAuthenticationChecks.Check (user); // 5. Kembalikan Otentikasi Bersertifikat Nyata Mengembalikan ini. Dua cek di UserDetails di sini terutama melalui empat metode yang mengembalikan tipe Boolean.
Setelah verifikasi informasi, otentikasi yang diautentikasi dikembalikan melalui metode konstruksi UsernamePasswordAuthenticationToken .
Setelah mendapatkan otentikasi bersertifikat, Successhandler akan dipanggil lagi. Atau jika gagal otentikasi, hubungi Failhandler.
Bagaimana hasil otentikasi dibagikan di antara banyak permintaan
Setelah menyelesaikan proses pemrosesan otentikasi pengguna, mari kita pikirkan tentang cara membagikan hasil otentikasi antara banyak permintaan?
Karena tidak ada konfigurasi untuk ini, kita dapat memikirkan metode default yang seharusnya menyimpan hasil otentikasi di sesi.
Jadi kapan disimpan dalam sesi?
Kami dapat terus melihat kode sumber dari proses otentikasi. Setelah lulus metode upaya, jika otentikasi berhasil, keberhasilan akan dipanggil. Dalam metode ini, tidak hanya SuccessHandler dipanggil, tetapi juga garis kode yang lebih penting
SecurityContextholder.getContext (). SetAuthentication (authResult);
SecurityContextholder adalah paket untuk ThreadLocal. ThreadLocal adalah kelas penyimpanan data di dalam utas. Melalui itu, data dapat disimpan dalam utas yang ditentukan. Setelah penyimpanan data, hanya data yang disimpan yang dapat diperoleh di utas yang ditentukan, tetapi utas lain tidak dapat memperoleh data. Untuk informasi lebih lanjut tentang prinsip -prinsip ThreadLocal, silakan periksa artikel saya sebelumnya.
Secara umum, permintaan dan pengembalian antarmuka yang sama akan diselesaikan dalam satu utas. Kami menempatkan Authresult di SecurityContextholder, dan kami juga dapat membawanya ke tempat lain.
Akhirnya, AuthResult diambil dari SecurityContextPersistenceFilter dan sesi disimpan.
SecurityContextPersistencefilter juga merupakan filter, yang berada di garis depan dari seluruh rantai filter keamanan, yang berarti bahwa filter pertama kali dilewatkan ketika verifikasi dimulai, dan lulus terakhir akhirnya dilewati setelah verifikasi selesai.
Dapatkan informasi pengguna yang diautentikasi
/*** Dapatkan pengguna yang saat ini dicatat* @return Otentikasi lengkap*/ @getMapping ("/me1") objek publik CurrentAser () {return securityContextholder.getContext (). GetAuthentication ();} @getMapping ("/Me2") Objek CurrentAser (otentikasi otentikasi) {Authentication) {Authentication) {authentication) {authentication) {authentication) UserDetails */@getMapping ("/me3") objek publik cuurentuser (@AuthenticationPrincipal userDetails userDetails) {return userDetails;}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.