Mengamankan Java Rest API dengan Keselamatan Musim Bunga dan JWT
Jul 31, 2025 am 09:13 AMUntuk melaksanakan mekanisme keselamatan API REST yang berpangkalan di JWT dalam aplikasi boot musim bunga, pertama sekali, anda perlu memahami bahawa pelayan mengeluarkan JWT selepas log pengguna masuk. Pelanggan membawa token dalam tajuk kebenaran permintaan berikutnya, dan pelayan mengesahkan kesahihan token melalui penapis tersuai; 2. Tambah Spring-Boot-Starter-security, Spring-Boot-Starter-Web dan JJWT-API, JJWT-IMPL, dan JJWT-Jackson Dependency di POM.XML; 3. Buat kelas alat JWTutil untuk menjana, menghuraikan dan mengesahkan JWT, termasuk kaedah untuk mengekstrak nama pengguna, masa tamat tempoh, menghasilkan token dan mengesahkan sama ada token itu sah; 4. Tulis JWTrequestFilter mewarisi OncePerRequestFilter, mengekstrak token pembawa dalam permintaan, memasangkan nama pengguna dan memuat butiran pengguna. Jika token itu sah, menetapkan pengesahan kepada SecurityContext; 5. Konfigurasi kelas SecurityConfig, melumpuhkan CSRF, menetapkan /mengesahkan dan /mendaftar laluan untuk dibebaskan, dan permintaan lain memerlukan pengesahan, dan mengkonfigurasi pengurusan sesi tanpa stat untuk menambah JWTrequestFilter ke rantai penapis; 6. Menyediakan AuthController untuk mengendalikan permintaan pengesahan, mengesahkan kelayakan melalui AuthenticationManager, menjana JWT dan mengembalikan AuthResponse selepas kejayaan; 7. Melaksanakan UserDetailSService untuk memuatkan maklumat pengguna untuk pengesahan; 8. Amalan terbaik keselamatan termasuk menggunakan HTTPS, mengelakkan kunci berkod keras, menetapkan masa tamat tempoh yang munasabah, tidak menyimpan maklumat sensitif dalam muatan, mengesahkan penerbit dan penonton, dan menggunakan JWKS dalam sistem yang diedarkan; Dengan mengintegrasikan keselamatan Spring dan JWT, seni bina keselamatan yang tidak berskala dan berskala boleh dilaksanakan, menyokong keizinan peranan seterusnya dan menyegarkan mekanisme token.
Mengamankan API REST Java adalah keperluan kritikal dalam aplikasi web moden, terutamanya apabila menggunakan mekanisme pengesahan tanpa statur seperti JSON Web Tokens (JWT). Keselamatan Spring, digabungkan dengan JWT, menyediakan cara yang mantap dan fleksibel untuk melindungi titik akhir anda. Berikut adalah cara untuk melaksanakannya dengan berkesan dalam aplikasi boot musim bunga.

1. Memahami seni bina
Sebelum menyelam ke dalam kod, penting untuk memahami aliran:
- Pengguna menghantar kelayakan log masuk (misalnya, nama pengguna dan kata laluan).
- Pelayan mengesahkannya dan mengembalikan JWT.
- Pelanggan termasuk JWT ini dalam tajuk
Authorization
(sebagaiBearer <token></token>
) untuk permintaan berikutnya. - Pelayan mengesahkan token pada setiap permintaan menggunakan penapis sebelum membenarkan akses.
Keselamatan Spring mengendalikan pengesahan dan kebenaran, sementara penapis tersuai memintas permintaan untuk mengesahkan JWT.

2. Tambah kebergantungan yang diperlukan
Dalam pom.xml
anda, sertakan:
<dependencies> <geterlihat> <groupId> org.springframework.boot </groupId> <stifactid> Spring-Boot-Starter-Security </artifactid> </ketergantungan> <geterlihat> <groupId> org.springframework.boot </groupId> <stistfactid> Spring-Boot-Starter-Web </artifactid> </ketergantungan> <geterlihat> <groupId> io.jsonwebtoken </groupId> <stistfactid> jjwt-api </artifactid> <versi> 0.11.5 </versi> </ketergantungan> <geterlihat> <groupId> io.jsonwebtoken </groupId> <stistfactid> jjwt-impl </artifactid> <versi> 0.11.5 </versi> <scope> runtime </scope> </ketergantungan> <geterlihat> <groupId> io.jsonwebtoken </groupId> <ctiFactId> JJWT-Jackson </artifactid> <versi> 0.11.5 </versi> <scope> runtime </scope> </ketergantungan> </dependencies>
3. Buat kelas utiliti JWT
Kelas ini mengendalikan penjanaan token, pengesahan, dan pengekstrakan.

@Component jwtutil kelas awam { STRING FINAL SRETRACE Secret_key = "YourseCretKeyTheatisLongenoughforhs512"; // Gunakan kunci yang kuat persendirian final int expiration_time = 86400000; // 24 jam String awam ExtractUserName (String Token) { kembali ExtractClaim (token, tuntutan :: getSubject); } ExtractExpiration Tarikh Awam (Token String) { kembali ExtractClaim (token, tuntutan :: getexpiration); } awam <T> t ExtractClaim (Token String, Fungsi <Tuntutan, T> Tuntutan) { tuntutan akhir tuntutan = extractAllClaims (token); pulangan claimResolver.apply (tuntutan); } Tuntutan Peribadi ExtractAllClaims (String Token) { kembali jwts.parser () setsigningKey (rahsia) .parseclaimsjws (token) .getBody (); } Boolean Private isTokenExpired (String Token) { kembali ExtractExpiration (token). Sebelum (tarikh baru ()); } rentetan awam generateToken (userDetails userDetails) { Peta <string, object> claims = hashMap baru <> (); kembali createToken (tuntutan, userDetails.getUserName ()); } String peribadi CreateToken (peta <string, object> tuntutan, subjek rentetan) { kembali jwts.builder () .setClaims (tuntutan) .setSubject (subjek) .SetIsedat (Tarikh Baru (System.CurrentTimemillis ())) .SetExpiration (tarikh baru (System.CurrentTimemillis () expiration_time))) .signwith (signatureAlgorithm.hs512, rahsia_key) .compact (); } public boolean validateToken (string token, userDetails userDetails) { Final String userName = ExtractUserName (token); kembali (username.equals (userDetails.getUserName ()) &&! isTokeNexpired (token)); } }
4. Penapis Pengesahan JWT Custom
Penapis ini berjalan sebelum kebanyakan pemeriksaan keselamatan musim bunga dan mengesahkan JWT dari tajuk Authorization
.
@Component kelas awam JWTrequestFilter memanjangkan OncePerRequestFilter { @Autowired UserDetailSService UserDetailSService; @Autowired Jwtutil swasta JWtutil; @Override DOFILTERINTERNAL VOID DOFILTERNAL (HTTPSERVLETREQUEST, HTTPSERVLETRESPONSE RESPONE, FILTERCHAIN CHAIN) melemparkan servletException, ioException { Final String AuthorizationHeader = Request.GeTheader ("kebenaran"); Nama pengguna String = null; String jwt = null; jika (Pihak BerkuasaMeader! = NULL && AUTERNIZATIONHEADER.STARTSWITH ("pembawa")) { JWT = Pihak berkuasa.Substring (7); nama pengguna = jwtutil.extractuserName (jwt); } jika (nama pengguna! = null && keselamatanContexTholder.getContext (). getAuthentication () == null) { UserDetails userDetails = this.userDetailsService.loadUserByuserName (username); jika (jwtutil.validateToken (jwt, userDetails)) { UsernamePasswordAuthenticationToken authToken = newPasswordAuthenticationToken ( userDetails, null, userDetails.getAuthorities ()); authToken.setDetails (baru WebAuthenticationDetailSsource (). BuildDetails (Request)); KeselamatanContexTholder.getContext (). SetAuthentication (authToken); } } chain.dofilter (permintaan, respons); } }
5. Konfigurasikan keselamatan musim bunga
Mengatasi WebSecurityConfigurerAdapter
(atau gunakan konfigurasi berasaskan komponen dalam versi yang lebih baru).
@Configuration @EnableWebsecurity Kelas Awam SecurityConfig memperluaskan WebSecurityConfigurerAdapter { @Autowired UserDetailSService UserDetailSService; @Autowired swasta JWTrequestfilter JWTrequestFilter; @Bean kata laluan kata laluan awamCoder () { kembali bcryptpasswordencoder baru (); } @Override Konfigurasi Void yang dilindungi (AuthenticationManagerBuilder auth) melemparkan pengecualian { auth.userDetailsService (userDetailSservice) .passwordencoder (passwordencoder ()); } @Bean @Override Public AuthenticationManager AuthenticationManagerBean () melemparkan pengecualian { kembali Super.AuthenticationManagerBean (); } @Override Konfigurasi Void yang Dilindungi (Httpsecurity http) melemparkan pengecualian { http.csrf (). lumpuhkan () . AuthorizeRequests () .AntMatchers ("/mengesahkan"). PermitAll () .AntMatchers ("/daftar"). PermitAll () .yeRequest (). Disahkan () .dan () .SessionManagement () .SessionCreationPolicy (sessionCreationPolicy.stateless); http.addfilterBefore (JWTrequestFilter, usernamePasswordAuthenticationFilter.class); } }
Nota: Dalam Spring Boot 3, gunakan
SecurityFilterChain
Bean dan bukannya memperluaskanWebSecurityConfigurerAdapter
.
6. Buat titik akhir pengesahan
@RestController kelas awam AuthController { @Autowired Authentication Private AuthenticationManager; @Autowired UserDetailSService UserDetailSService; @Autowired Jwtutil swasta JWtutil; @PostMapping ("/mengesahkan") Tindak Balas Awam <?> CreateAuthenticationToken (@RequestBody AuthRequest AuthRequest) melemparkan Pengecualian { Cuba { AuthenticationManager.Authenticate ( newAnamePassWordAuthenticationToken (authRequest.getUserName (), authRequest.getPassword ()) ); } menangkap (badcredentialSexception e) { Buang pengecualian baru ("Nama pengguna atau kata laluan yang tidak betul", e); } UserDetails akhir userDetails = userDetailsService.LoadUserByUserName (authRequest.getuserName ()); String akhir jwt = jwtutil.generateToken (userDetails); kembali responseNtity.OK (New AuthResponse (JWT)); } }
Dengan DTOS:
kelas awam AuthRequest { Nama Pengguna String Peribadi; kata laluan rentetan peribadi; // getters dan setters } kelas awam AuthResponse { token rentetan peribadi; awam AuthResponse (String Token) {this.token = token; } // getter }
7. Pelaksanaan UserDetailSService
@Service kelas awam myuserdetailsservice melaksanakan userDetailsService { @Autowired UserRepository UserRepository swasta; @Override userDetails public loadUserByUserName (String username) { Pengguna Pengguna = userRepository.FindByUserName (nama pengguna) .orelsethrow (() -> usernamenotFoundException baru ("pengguna tidak dijumpai")); Kembalikan org.springframework.security.core.userdetails.user baru ( user.getUserName (), user.getPassword (), arrayList baru <> ()); } }
8. Amalan Terbaik & Petua Keselamatan
- Gunakan HTTPS dalam pengeluaran - JWTs sensitif.
- Pastikan kunci rahsia selamat - tidak pernah kod hardcode di sumber; Gunakan pembolehubah persekitaran atau alat pengurusan rahsia.
- Tetapkan masa tamat token yang munasabah -Token jangka pendek dengan token penyegaran lebih baik.
- Elakkan menyimpan data sensitif dalam muatan JWT -ia dikodkan oleh Base64, tidak disulitkan.
- Mengesahkan tuntutan penerbit dan penonton dalam aplikasi gred pengeluaran.
- Pertimbangkan menggunakan JWKS (set kunci web JSON) untuk sistem yang diedarkan.
Ringkasan
Dengan menggabungkan Spring Security dan JWT, anda mendapat cara yang bersih dan tidak bersuara untuk mendapatkan API REST. Komponen utama adalah:
- Utiliti JWT untuk penciptaan/pengesahan token
- Penapis untuk memintas dan mengesahkan permintaan
- Konfigurasi keselamatan musim bunga yang betul
- Titik akhir log masuk untuk mengeluarkan token
Persediaan ini digunakan secara meluas, berskala, dan mengintegrasikan dengan baik dengan kerangka frontend dan aplikasi mudah alih.
Pada asasnya, sebaik sahaja asas itu ada, memperluaskan peranan, keizinan, atau menambah token penyegaran menjadi terkawal.
Atas ialah kandungan terperinci Mengamankan Java Rest API dengan Keselamatan Musim Bunga dan JWT. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Enums di Java adalah kelas khas yang mewakili bilangan tetap nilai tetap. 1. Gunakan definisi kata kunci enum; 2. Setiap nilai enum adalah contoh akhir statik awam jenis enum; 3. Ia boleh termasuk bidang, pembina dan kaedah untuk menambah tingkah laku kepada setiap pemalar; 4. Ia boleh digunakan dalam pernyataan suis, menyokong perbandingan langsung, dan menyediakan kaedah terbina dalam seperti nama (), ordinal (), nilai () dan nilai (); 5. Penghitungan boleh meningkatkan jenis keselamatan, kebolehbacaan dan fleksibiliti kod, dan sesuai untuk senario pengumpulan terhad seperti kod status, warna atau minggu.

Prinsip pengasingan antara muka (ISP) menghendaki pelanggan tidak bergantung pada antara muka yang tidak digunakan. Inti adalah untuk menggantikan antara muka yang besar dan lengkap dengan pelbagai antara muka kecil dan halus. Pelanggaran prinsip ini termasuk: Pengecualian yang tidak diletakkan dilemparkan apabila kelas melaksanakan antara muka, sebilangan besar kaedah tidak sah dilaksanakan, dan fungsi yang tidak relevan secara paksa diklasifikasikan ke antara muka yang sama. Kaedah permohonan termasuk: membahagikan antara muka mengikut kaedah biasa, menggunakan antara muka berpecah mengikut pelanggan, dan menggunakan kombinasi dan bukannya pelaksanaan pelbagai antara muka jika perlu. Sebagai contoh, perpecahan antara muka mesin yang mengandungi kaedah percetakan, pengimbasan, dan faks ke dalam pencetak, pengimbas, dan faxmachine. Peraturan boleh dilonggarkan dengan sewajarnya apabila menggunakan semua kaedah pada projek kecil atau semua pelanggan.

Java menyokong pengaturcaraan asynchronous termasuk penggunaan aliran yang boleh diselesaikan, aliran responsif (seperti ProjectReactor), dan benang maya di Java19. 1.CompletableFuture meningkatkan kebolehbacaan dan penyelenggaraan kod melalui panggilan rantai, dan menyokong orkestrasi tugas dan pengendalian pengecualian; 2. ProjectReactor menyediakan jenis mono dan fluks untuk melaksanakan pengaturcaraan responsif, dengan mekanisme tekanan belakang dan pengendali yang kaya; 3. Thread maya mengurangkan kos konvensional, sesuai untuk tugas I/O-intensif, dan lebih ringan dan lebih mudah untuk berkembang daripada benang platform tradisional. Setiap kaedah mempunyai senario yang berkenaan, dan alat yang sesuai harus dipilih mengikut keperluan anda dan model campuran harus dielakkan untuk mengekalkan kesederhanaan

Terdapat tiga perbezaan utama antara yang boleh dipanggil dan boleh dijalankan di Jawa. Pertama, kaedah yang boleh dipanggil boleh mengembalikan hasilnya, sesuai untuk tugas -tugas yang perlu mengembalikan nilai, seperti yang boleh dipanggil; Walaupun kaedah run () runnable tidak mempunyai nilai pulangan, sesuai untuk tugas -tugas yang tidak perlu kembali, seperti pembalakan. Kedua, Callable membolehkan untuk membuang pengecualian yang diperiksa untuk memudahkan penghantaran ralat; Walaupun Runnable mesti mengendalikan pengecualian secara dalaman. Ketiga, Runnable boleh dihantar secara langsung ke benang atau executorservice, sementara yang boleh dipanggil hanya boleh dikemukakan ke executorservice dan mengembalikan objek masa depan untuk

Di Java, enums sesuai untuk mewakili set tetap tetap. Amalan terbaik termasuk: 1. Gunakan enum untuk mewakili keadaan tetap atau pilihan untuk meningkatkan keselamatan jenis dan kebolehbacaan; 2. Tambah sifat dan kaedah untuk meningkatkan fleksibiliti, seperti menentukan bidang, pembina, kaedah penolong, dan lain -lain; 3. Gunakan enummap dan enumset untuk meningkatkan prestasi dan jenis keselamatan kerana mereka lebih cekap berdasarkan tatasusunan; 4. Elakkan penyalahgunaan enum, seperti nilai dinamik, perubahan kerap atau senario logik kompleks, yang harus digantikan dengan kaedah lain. Penggunaan enum yang betul boleh meningkatkan kualiti kod dan mengurangkan kesilapan, tetapi anda perlu memberi perhatian kepada sempadannya yang berkenaan.

Javanio adalah IOAPI baru yang diperkenalkan oleh Java 1.4. 1) bertujuan untuk penampan dan saluran, 2) mengandungi komponen teras penampan, saluran dan pemilih, 3) menyokong mod tidak menyekat, dan 4) mengendalikan sambungan serentak lebih cekap daripada IO tradisional. Kelebihannya dicerminkan dalam: 1) IO yang tidak menyekat mengurangkan overhead thread, 2) Buffer meningkatkan kecekapan penghantaran data, 3) pemilih menyedari multiplexing, dan 4) memori pemetaan memori sehingga membaca dan menulis fail. Nota Apabila menggunakan: 1) Operasi flip/jelas penampan mudah dikelirukan, 2) Data yang tidak lengkap perlu diproses secara manual tanpa menyekat, 3) Pendaftaran pemilih mesti dibatalkan dalam masa, 4) NIO tidak sesuai untuk semua senario.

JavaprovidesmultiplesynchronizationToolsforthreadsafety.1.SynchronizedBlockSensensureMutualExclusionByLockingMethodsorspecificcodesections.2.reentrantlockoffersadvancedControl, termasuktrylockandfairnesspolicies.condition

Mekanisme pemuatan kelas Java dilaksanakan melalui kelas, dan aliran kerja terasnya dibahagikan kepada tiga peringkat: memuatkan, menghubungkan dan memulakan. Semasa fasa pemuatan, kelas muat turun secara dinamik membaca bytecode kelas dan mencipta objek kelas; Pautan termasuk mengesahkan ketepatan kelas, memperuntukkan memori kepada pembolehubah statik, dan rujukan simbol parsing; Inisialisasi melakukan blok kod statik dan tugasan pembolehubah statik. Pemuatan kelas mengamalkan model delegasi induk, dan mengutamakan loader kelas induk untuk mencari kelas, dan cuba bootstrap, lanjutan, dan appliclassloader pada gilirannya untuk memastikan perpustakaan kelas teras selamat dan mengelakkan pemuatan pendua. Pemaju boleh menyesuaikan kelas, seperti UrlClassl
