Klasifikasi Penggunaan Keamanan Musim Semi:
Saya percaya semua orang yang tinggal di Baidu tahu cara menggunakan keamanan musim semi. Ada empat penggunaan, dari sederhana hingga dalam:
1. Tidak ada database yang digunakan, semua data ditulis dalam file konfigurasi, yang juga merupakan demo dalam dokumen resmi;
2. Gunakan database dan terapkan desain kode default dari database sesuai dengan keamanan musim semi, yang berarti bahwa database telah diperbaiki, metode ini tidak fleksibel, dan database dirancang sangat sederhana dan memiliki kepraktisan yang buruk;
3. Keamanan Musim Semi berbeda dari Acegi. Itu tidak dapat memodifikasi filter default lagi, tetapi mendukung memasukkan filter, jadi berdasarkan ini, kita dapat memasukkan filter kita sendiri untuk digunakan secara fleksibel;
4. Cara kekerasan untuk memodifikasi kode sumber. Modifikasi filter default yang disebutkan di atas hanya untuk memodifikasi file konfigurasi untuk mengganti filter. Ini secara langsung mengubah kode sumber di dalam, tetapi ini tidak sesuai dengan prinsip desain OO, dan tidak praktis dan tidak tersedia.
Artikel ini terutama memperkenalkan konten yang relevan tentang login otentikasi khusus Spring Security. Ini dibagikan untuk referensi dan pembelajaran Anda. Saya tidak akan mengatakan banyak hal di bawah. Mari kita lihat perkenalan terperinci bersama -sama.
1. Ringkasan
1.1. Perkenalan
Spring Security adalah kerangka keamanan berdasarkan filter AOP dan servlet musim semi untuk mengelola otentikasi izin, dll.
1.2.SPRING Security Proses Otentikasi Kustom
1) Proses otentikasi
Hasilkan AuthenticationTokens yang tidak otentikasi
↑ (Dapatkan Informasi) (Tetapkan Penyedia Menurut AuthenticationToken) AuthenticationFilter -> AuthenticationManager -> AuthenticationProvider ↓ (Authentication) UserDetails (Akuisisi Basis Data Kueri Umum) ↓ (PASS) Hasilkan AuthenticationToken yang telah berhasil diotentikasi ↓) SecurityContexTholder yang telah berhasil diotentikasi ↓) SecurityContexTholder yang telah berhasil dikotentikasi ↓) SecurityContexTholder yang berhasil telah berhasil dikotentikasi ↓) (penyimpanan) SecurityContexTholder yang berhasil telah berhasil dikotentikasi ↓) (penyimpanan) SecurityContextholder
2) Tambahkan AuthenticationFilter ke rantai filter keamanan (dikonfigurasi di server sumber daya), seperti:
http.addfilterbefore (AuthenticationFilter, AbstractPreatenticatedProcessingFilter.class)
atau:
http.addfilterafter (authenticationfilter, usernamepasswordAuthenticationFilter.class)
2. Ambil login SMS sebagai contoh
2.1. Lingkungan pengembangan
2.2. Analisis Kode Inti
2.2.1. Proses Otentikasi Login Kustom
2.2.1.1. Token Login Otentikasi Kustom
/** * Token Login Seluler * * @Author: Catalpaflat */Kelas Publik MobileLoginauthenticationToken memperluas AbstractAuthenticationToken {private static final long serialversionuid = springsecuritycoreversion.serial_version_uid; Private Static Final Logger Logger = LoggerFactory.getLogger (MobileLoginauthenticationToken.class.getName ()); Kepala Sekolah Objek Akhir Pribadi; Public MobileLoguliauthenticationToken (String Mobile) {super (null); this.principal = seluler; this.setAuthenticated (false); Logger.info ("MobileloginauthenticationToken setauthenticated -> false loading ..."); } public MobileLoginouthenticationToken (Object Principal, Collection <? Extends Grantedauthority> Otoritas) {super (otoritas); this.principal = prinsipal; // harus menggunakan super, karena kita mengganti super.setAuthenticated (true); Logger.info ("MobileloginauthenticationToken setauthenticated -> True Loading ..."); } @Override public void setAuthenticated (boolean diautentikasi) {if (diautentikasi) {lempar baru ilegalargumentException ("tidak dapat mengatur token ini ke konstruktor yang tepercaya - menggunakan konstruktor yang mengambil daftar yang diberikan dan sebagai gantinya"); } super.setAuthenticated (false); } @Override objek publik getCredentials () {return null; } @Override objek publik getPrincipal () {return this.principal; } @Override public void erasecredentials () {super.erasecredentials (); }} Catatan:
setauthenticated (): Menentukan apakah itu telah diautentikasi
2.2.1.1. Filter login otentikasi khusus
/** * Filter login SMS seluler * * @Author: Catalpaflat */Kelas Publik MobileLoginauthenticationFilter memperluas abstractAuthenticationProcessingFilter {private boolean postOnly = true; private static final Logger Logger = LoggerFactory.getLogger (MOBILELOGINOUTHENTICATIONFILTER.CLASS.GETNAME ()); @Getter @setter Private String MobileParametername; Public MobileLoguliauthenticationFilter (String MobileLoginUrl, String MobileParametername, String httpMethod) {super (antpathrequestMatcher baru (MobileloginUrl, httpmethod)); this.mobileParametername = MobileParametername; Logger.info ("MobileloginauthenticationFilter Loading ..."); } @Override Public Authentication TREDAuthentication (permintaan httpservletRequest, httpservletResponse response) melempar authenticationException, ioException, servletException {if (postonly && nouton (). didukung: " + request.getMethod ()); } // Dapatkan seluler seluler seluler = ESTRETMOBILE (permintaan); // kumpulkan token MobileLoginauthenticationToken AuthRequest = MobileLoginoticationToken (Mobile) baru; // Izinkan subkelas untuk mengatur setDetail "detail" (permintaan, authRequest); kembalikan this.getAuthenticationManager (). Otentikasi (authRequest); } / *** Rincian untuk pengaturan otentikasi identitas* / private void setDetails (permintaan httpservletRequest, mobileloginauthenticationToken authrequest) {authrequest.setDetails (authenticationDetailssource.builddetails (request)); } / *** Dapatkan nomor ponsel* / string privat dapatkan Mobile (permintaan httpservletrequest) {return request.getParameter (mobileParametername); } public void setPostOnly (boolean postOnly) {this.postonly = postOnly; }}CATATAN: Metode TREEDAuthentication ():
2.2.1.1. Penyedia login otentikasi khusus
/** * Penyedia Otentikasi Login SMS Seluler * * @Author: CatalPaflat */Kelas Publik MobileLoginauthenticationProvider mengimplementasikan AuthenticationProvider {private static final Logger Logger = LoggerFactory.getLogger (MobileLoginaTicationProvider.class.getName (); @Getter @setter private userDetailSService CustomUserDetailsService; Public MobileLoguliauthenticationProvider () {Logger.info ("MobileloginauthenticationProvider Loading ..."); } /*** Otentikasi* /@Override Otentikasi Publik Otentikasi (Otentikasi Otentikasi) melempar AuthenticationException {// Dapatkan informasi token yang dienkapsulasi oleh filter MobileLoginauthenticationToken AuthenticationToken = (MobileLoginauthenticationToken) Authentication; // Dapatkan informasi pengguna (otentikasi basis data) userDetails userDetails = customUserDetailsService.LoadUserByUserName ((String) authenticationToken.getPrincipal ()); // tidak lulus if (userDetails == null) {lempar internalAuthenticationServiceException baru ("tidak dapat memperoleh informasi pengguna"); } // oleh MobileLoGinauthenticationToken AuthenticationResult = baru MobileLoginauthenticationToken (userDetails, userdetails.getauthority ()); AuthenticationResult.SetDetails (authenticationToken.getDetails ()); Return AuthenticationResult; } / ** * Menurut tipe token, tentukan penyedia mana yang akan digunakan * / @Override Public Boolean Dukungan (kelas <?> Otentikasi) {return MobileLoginouthenticationToken.class.isassignableFrom (otentikasi); }}Catatan: Metode otentikasi ()
2.2.1.1. Konfigurasi Otentikasi Login Kustom
@Configuration (springbeannameconstant.default_custom_mobile_login_authentication_security_config_bn) kelas publik MobileloginauthenticationCurityCurityConfig Memperluas SecurityConfigurerAdapter <DefaultSecurityFilterChain, httpsecurity> {private state = private = httpsecurity> {private = private = private = httpsecurity> {private = private = httpsecurity> {private = private = httpsecurity> {private = private = httpsecurity> {httpsecurity> LoggerFactory.getLogger (MOBILELOGINOUTHENTICATIONSECURTYCONFIG.Class.getName ()); @Value ("$ {login.mobile.url}") Private String defaultMobileLoginUrl; @Value ("$ {login.mobile.parameter}") Private String defaultMobileLogInparameter; @Value ("$ {login.mobile.httpmethod}") Private String defaultMobileLoGinHttpMethod; @Autowired Private CustomyMlConfig CustomyMlConfig; @Autowired private userDetailsService CustomUserDetailsService; @Autowired Private AuthenticationsUCCessHandler CustomAuthenticationsUCCessHandler; @Autowired Private AuthenticationFailureReHandler CustomAuthenticationFailureHandler; Public MobileLoguliauthenticationsEcurityConfig () {Logger.info ("MobileloginouthenticationsEcurity Config Loading ..."); } @Override public void configure (httpsecurity http) melempar Exception {MobilePoJo Mobile = customymlConfig.getLogins (). GetMobile (); String url = mobile.getUrl (); String parameter = mobile.getParameter (). GetMobile (); String httpmethod = mobile.getHttpmethod (); MobileloginoticationFilter MobileLoginouthenticationFilter = MobileLoginouthenticationFilter baru (stringutils.isblank (url)? DefaultMobileloginurl: URL, Stringutils.isblank (parameter)? DefaultMobileloginurl: Parameter.isblank (parameter)? DefaultMobileloginHttpMethod: httpmethod); MOBILELOGINOUTHENCATICEFILTER.SESTAuthenticationManager (http.getsharedObject (authenticationManager.class)); MOBILELOGINOUTHENTICATIONFILTER.SESTAuthENCATIONCESSCESSHANDLER (CustomAuthenticationsuccesshandler); MOBILELOGINOUTHENTICATIONFILTER.SetAuthenticationFailureHandler (customAuthenticationFailureHandler); MOBILELOGINOUTHENTICATIONPROVIDER MOBILELOGINOUTHENTICATICEDPROVIDER = MOBILELOGINOUTHENTICATICEDPROVIDER BARU (); MOBILELOGINOUTHENTIKASIPROVIDER.SETCUSTOMUSERDETAILSSERVICE (CustomUserDetailsService); http.authenticationProvider (MobileloginauthenticationProvider) .addfilterAfter (MobileLoginauthenticationFilter, UsernamepasswordAuthenticationFilter.class); }}Catatan: Metode Configure ()
Instantiate AuthenticationFilter dan AuthenticationProvider
Tambahkan AuthenticationFilter dan AuthenticationProvider ke Spring Security.
2.2.2. Verifikasi kode verifikasi khusus berdasarkan Redis
2.2.2.1. Filter kode verifikasi khusus berdasarkan redis
/** * Filter Kode Verifikasi * * @Author: CATALPAFLAT */ @Component (SpringBeanNameconstant.default_validate_code_filter_bn) Kelas Publik ValidateCodefilter Memperluas Logger Akhir Private Logger = Private Logger = LoggerFactory.getLogger (validateCodefilter.class.getName ()); @Autowired Private CustomyMlConfig CustomyMlConfig; @Autowired Private Redistemplate <Object, Object> Redistemplate; / *** Kelas alat yang memverifikasi apakah URL yang diminta cocok dengan URL*/ Private Antpathmatcher PathMatcher = baru antpathmatcher (); public validateCodefilter () {logger.info ("memuat validateCodefilter ..."); } @Override Protected void dofilterinternal (permintaan httpservletrequest, respons httpservletResponse, filterchain filterchain) melempar servletException, ioException {string url = customymlconfig.getLogins (). GetMobile (). Geturl (); if (pathmatcher.match (url, request.getRequesturi ())) {string deviceId = request.getHeader ("deviceId"); if (stringutils.isblank (deviceId)) {lempar customexception baru (httpstatus.not_acceptable.value (), "bukan perangkat di kepala permintaan"); } String codeparamname = customymlconfig.getLogins (). GetMobile (). GetParameter (). GetCode (); String code = request.getParameter (codeparamname); if (stringutils.isblank (kode)) {lempar customexception baru (httpstatus.not_acceptable.value (), "bukan kode dalam parameter permintaan"); } String key = SystemConsant.default_mobile_key_pix + deviceId; Smscodepo smscodepo = (smscodepo) redistemplate.opsforvalue (). Get (key); if (smscodepo.isexpried ()) {lempar customexception baru (httpstatus.bad_request.value (), "Kode verifikasi telah kedaluwarsa"); } String smscode = smscodepo.getCode (); if (stringutils.isblank (smscode)) {lempar customexception baru (httpstatus.bad_request.value (), "kode verifikasi tidak ada"); } if (stringutils.equals (kode, smscode)) {redistemplate.delete (key); // let it go filterchain.dofilter (permintaan, respons); } else {lempar customexception baru (httpstatus.bad_request.value (), "kode validasi salah"); }} else {// let it go filterchain.dofilter (request, response); }}}Catatan: dofilterinternal ()
Verifikasi Filter Kode Verifikasi Kustom
2.2.2.2. Tambahkan Filter Kode Verifikasi Kustom ke Rantai Filter Keamanan Musim Semi
http.addfilterbefore (validateCodefilter, abstractpreautticatedProcessingFilter.class)
Catatan: Sebelum menambahkan ke filter preprocessing otentikasi
3. Uji Efeknya
Akhirnya, alamat kode sumber dilampirkan: https://gitee.com/catalpaflat/springsecurity.git (unduhan lokal)
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.