Prinsip Implementasi
Dalam artikel sebelumnya, kami memperkenalkan metode masuk dengan kata sandi akun biasa: Springboot + SPRING Security BASIC Penggunaan dan konfigurasi login yang dipersonalisasi. Tetapi ada cara umum lainnya sekarang, yaitu masuk langsung melalui kode verifikasi SMS ponsel Anda. Di sini Anda perlu melakukan beberapa pekerjaan tambahan sendiri.
Anyone who has a certain understanding of the detailed explanation of the SpringSecurity authentication process knows that in the process of account password authentication, the following categories are involved: UsernamePasswordAuthenticationFilter (used to request parameter acquisition), UsernamePasswordAuthenticationToken (represents user login information), ProviderManager (for authentication verification),
Karena masuk melalui kode verifikasi SMS, kita perlu menulis ulang parameter yang diminta, proses otentikasi, dan informasi token login pengguna untuk jumlah tertentu.
Tentu saja, kita harus menempatkan proses kode verifikasi terlebih dahulu, jika kode verifikasi grafik diimplementasikan sama. Keuntungan dari pendekatan ini adalah bahwa proses otentikasi kode verifikasi dipisahkan sehingga antarmuka lain juga dapat digunakan.
Implementasi Dasar
Verifikasi kode verifikasi
Implementasi fungsional kode verifikasi SMS sebenarnya sama dengan prinsip kode verifikasi grafis. Hanya saja yang satu adalah mengembalikan gambar ke ujung depan, dan yang lainnya adalah mengirim pesan singkat kepada pengguna. Di sini Anda hanya perlu memanggil antarmuka penyedia layanan SMS. Untuk prinsip -prinsip lebih lanjut, silakan merujuk ke Springboot + Springsecurity untuk mengimplementasikan fungsi kode verifikasi grafis.
AuthenticationToken
Saat masuk dengan kata sandi akun Anda, UserNamepasswordAuthenticationToken berisi akun pengguna, kata sandi, dan informasi status lainnya seperti apakah tersedia. Kami masuk melalui SMS di ponsel, jadi kami tidak memiliki kata sandi. Di sini kami hanya menyalin kode USERNAMEPASSWORDAuthenticationToken dan menghapus informasi terkait kata sandi.
kelas publik smscodeAuthenticationToken memperluas abstractAuthenticationToken {private static final long serialversionuid = springsecuritycoreversion.serial_version_uid; Kepala Sekolah Objek Akhir Pribadi; public smscodeAuthenticationToken (string seluler) {super (null); this.principal = seluler; setauthenticated (false); } public smscodeAuthenticationToken (Object Principal, Collection <? Extends Grantedauthority> Otoritas) {super (otoritas); this.principal = prinsipal; super.setAuthenticated (true); // Harus menggunakan super, karena kita mengganti} objek publik getCredentials () {return null; } objek publik getPrincipal () {return this.principal; } public void setAuthenticated (boolean isAuthenticated) melempar ilegalargumentException {if (isAuthenticated) {melempar baru ilegalargumentException ("tidak dapat mengatur token ini ke konstruktor yang dipercaya - gunakan yang mengambil daftar yang diberikan sebagai gantinya"); } super.setAuthenticated (false); } @Override public void erasecredentials () {super.erasecredentials (); }} AuthenticationFilter
Dalam proses pencatatan dalam kata sandi akun, standarnya adalah USERNAMEPASSWORDAuthenticationFilter. Fungsinya adalah untuk mendapatkan akun dan kata sandi dari permintaan, memverifikasi metode permintaan, dan menghasilkan authenticationToken. Di sini parameter kami telah berubah dengan cara tertentu, jadi masih merupakan metode lama, salin untuk membuat modifikasi sederhana
kelas publik smscodeAuthenticationFilter memperluas abstractAuthenticationProcessingFilter {// permintaan parameter kunci string pribadi mobileParameter = securityconstants.default_parameter_name_mobile; // Apakah itu hanya didukung post private boolean postonly = true; Publik SMScOdeAuthenticationFilter () {// Minta URL Super antarmuka (antpathRequestMatcher baru (SecurityConstants.default_login_processing_url_mobile, "post")); } TROWAuthentication otentikasi publik (permintaan httpservletrequest, respons httpservletResponse) melempar authenticationException {if (postOnly &&! request.getMethod (). Equals ("Post")) {throw new AuthenticationServiceException ("Metode otentikasi yang tidak didukung:" + } // Dapatkan nilai permintaan sesuai dengan nama parameter permintaan String Mobile = Evervobile (Request); if (seluler == null) {Mobile = ""; } Mobile = Mobile.trim (); // menghasilkan otentikasi yang sesuai dengan smscodeAuthenticationToken authRequest = new smscodeAuthenticationToken (seluler); setDetails (permintaan, authrequest); kembalikan this.getAuthenticationManager (). Otentikasi (authRequest); } / *** Dapatkan nomor ponsel* / string protected mendapatkan mobile (permintaan httpservletRequest) {return request.getParameter (MobileParameter); } // hilangkan kode yang tidak relevan} Penyedia
Selama proses login kata sandi akun, kebenaran kata sandi dan apakah akun tersedia diverifikasi melalui DaoAuthenticationProvider. Kita juga harus menerapkan penyedia
kelas publik SMScOdeAuthenticationProvider mengimplementasikan AuthenticationProvider {private userDetailSService userDetailSService; / ** * Verifikasi logika identitas * @param otentikasi * @return * @throws AuthenticationException */ @Override Otentikasi Otentikasi Publik (Otentikasi Otentikasi) melempar authenticationException {smscodeAuthenticationTokenToken = (smScodeAuthenticationToken); UserDetails user = userDetailSservice.LoadUserByUserName ((String) authenticationToken.getPrincipal ()); if (user == null) {lempar internalAuthenticationsexception baru ("Informasi pengguna tidak dapat diperoleh"); } SmscodeAuthenticationToken authenticationResult = new smscodeAuthenticationToken (user, user.getauthority ()); AuthenticationResult.SetDetails (authenticationToken.getDetails ()); Return AuthenticationResult; } @Override Public Boolean Dukungan (kelas <?> Otentikasi) {return smscodeAuthenticationToken.class.isassignableFrom (otentikasi); } public userDetailSservice getUserDetailsService () {return userDetailsService; } public void setUserDetailsService (userDetailsService userDetailsService) {this.userDetailsService = userDetailsService; }} Konfigurasi
Proses otentikasi utama dicapai melalui empat proses di atas. Di sini kita dapat mengurangi konfigurasinya.
@ComponentPublic kelas smscodeAuthenticationsEcurityConfig memperluas SecurityConfigurerAdapter <DefaultSecurityFilterChain, httpsecurity> {@Autowired swasta authenticationuccesshandler myauthenticationsuccesshandler; @Autowired Private AuthenticationFailureHandler MyAuthenticationFailureHandler; @Autowired private userDetailsService userDetailsService; @Override public void configure (httpsecurity http) melempar Exception {smscodeAuthenticationFilter smscodeAuthenticationFilter = new smscodeAuthenticationFilter (); smscodeAuthenticationFilter.setAuthenticationManager (http.getsharedObject (authenticationManager.class)); smscodeAuthenticationFilter.setAuthenticationsuccesshandler (myAuthenticationsuccesshandler); smscodeAuthenticationFilter.setAuthenticationFailureHandler (myAuthenticationFailureHandler); SmscodeAuthenticationProvider smscodeAuthenticationProvider = new smscodeAuthenticationProvider (); smscodeAuthenticationProvider.setUserdetailsService (userDetailsService); http.authenticationProvider (smscodeAuthenticationProvider) .addfilterAfter (smscodeAuthenticationFilter, usernamepasswordAuthenticationFilter.class); }} // browersecurityconfig.java@overrideprotected void configure (httpsecurity http) melempar Exception {http.Apply (SMScOdeAuthenticationsEcurityConfig);} Unduh kode
Kurin Kecelakaan Musim Semi
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.