Perkhidmatan Mikro dan API REST Spring Boot 4 · Pelajaran

Melindungi Titik Akhir REST

Laksanakan Spring Security untuk melindungi titik akhir API REST anda daripada akses tanpa kebenaran.

Pelajaran 2 daripada 311 langkah

Melindungi Titik Akhir REST ialah pelajaran Perkhidmatan Mikro dan API REST Spring Boot 4 percuma di CoddyKit. Ini ialah pelajaran 2 daripada 3. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Perkhidmatan Mikro dan API REST Spring Boot 4, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Perkhidmatan Mikro dan API REST Spring Boot 4 merangkumi sejumlah 3 pelajaran.

Mengapa Melindungi Titik Akhir API?

API ialah gerbang kepada data dan kefungsian aplikasi anda. Tanpa keselamatan yang sewajarnya, sesiapa sahaja boleh mengakses, mengubah suai atau memadam maklumat sensitif.

Pelajaran ini akan menunjukkan cara Spring Security membantu melindungi API REST anda daripada capaian tanpa kebenaran, bagi memastikan hanya pengguna yang sah boleh berinteraksi dengan perkhidmatan anda.

Spring Security: Petugas Pemeriksa API Anda

Spring Security ialah rangka kerja yang berkuasa dan sangat boleh disesuaikan untuk pengesahan dan kawalan capaian. Bagi API REST, rangka kerja ini bertindak seperti petugas pemeriksa, dengan menyemak bukti kelayakan sebelum membenarkan permintaan sampai ke titik akhir anda.

  • Rangka kerja ini mengendalikan pengesahan pengguna (siapa anda).
  • Rangka kerja ini mengurus keizinan (perkara yang boleh anda lakukan).
  • Rangka kerja ini melindungi daripada kerentanan web yang lazim.

Bermula: Tambah Kebergantungan

Untuk mengintegrasikan Spring Security ke dalam projek Spring Boot anda, anda perlu menambahkan kebergantungan pemula ke dalam fail pom.xml anda (jika menggunakan Maven).

Kebergantungan ini memasukkan semua komponen Spring Security dan konfigurasi automatik yang diperlukan.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Tingkah Laku Keselamatan Lalai

Setelah kebergantungan Spring Security ditambahkan, aplikasi Spring Boot anda secara automatik melindungi semua titik akhir HTTP!

Apabila anda menjalankan aplikasi, Spring Security menjana kata laluan rawak dan mencatatkannya pada konsol. Anda memerlukan kata laluan ini, bersama-sama nama pengguna lalai "user", untuk mengakses mana-mana titik akhir.

Menyesuaikan Peraturan Keselamatan

Keselamatan lalai ialah permulaan yang baik, tetapi anda mungkin mahu mentakrifkan peraturan sendiri. Kita melakukannya dengan mencipta kelas konfigurasi keselamatan.

Kelas ini menggunakan @Configuration dan @EnableWebSecurity, serta mentakrifkan bean SecurityFilterChain untuk menyesuaikan keselamatan HTTP.

Cuba jalankan persediaan asas ini. Persediaan ini masih memerlukan pengesahan, tetapi kita akan menambahkan pengguna selepas ini!

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

@Configuration
@EnableWebSecurity
class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.httpBasic(); // Enable basic auth
        http.authorizeHttpRequests(authorize -> authorize
            .anyRequest().authenticated() // All requests need auth
        );
        return http.build();
    }
}

@RestController
class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, Secured World!";
    }
}

Mentakrifkan Pengguna dalam Memori

Untuk aplikasi mudah atau pengujian, anda boleh mentakrifkan pengguna secara terus dalam konfigurasi keselamatan menggunakan bean InMemoryUserDetailsManager.

Kita akan menambahkan pengguna bernama "user" dengan kata laluan "password" dan peranan "USER". Nota: withDefaultPasswordEncoder() adalah untuk demonstrasi pantas; dalam persekitaran pengeluaran, gunakan pengekod kata laluan yang kukuh.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

@Configuration
@EnableWebSecurity
class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.httpBasic();
        http.authorizeHttpRequests(authorize -> authorize
            .anyRequest().authenticated()
        );
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

@RestController
class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, Secured User!";
    }
}

Keizinan Khusus Titik Akhir

Anda boleh mentakrifkan peraturan keselamatan yang berbeza untuk corak URL yang berbeza menggunakan requestMatchers(). Peraturan anyRequest().authenticated() memastikan semua permintaan lain memerlukan pengesahan.

Di sini, kita akan menetapkan supaya titik akhir /hello memerlukan pengesahan, manakala laluan lain adalah awam.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

@Configuration
@EnableWebSecurity
class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.httpBasic();
        http.authorizeHttpRequests(authorize -> authorize
            .requestMatchers("/hello").authenticated() // /hello requires auth
            .anyRequest().permitAll() // All other requests are public
        );
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

@RestController
class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, Secured User!";
    }

    @GetMapping("/public")
    public String publicEndpoint() {
        return "Hello, Public!";
    }
}

Titik Akhir Awam dengan permitAll()

Kadangkala anda memerlukan titik akhir yang tidak memerlukan sebarang pengesahan, seperti pemeriksaan kesihatan atau maklumat awam. Untuk titik akhir ini, gunakan .permitAll().

Turutan penting! Peraturan yang lebih khusus (seperti /public/**) hendaklah diletakkan sebelum peraturan yang lebih umum (seperti anyRequest()).

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

@Configuration
@EnableWebSecurity
class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.httpBasic();
        http.authorizeHttpRequests(authorize -> authorize
            .requestMatchers("/public/**").permitAll() // Public access
            .requestMatchers("/secure/**").authenticated() // Requires authentication
            .anyRequest().denyAll() // Deny all other requests by default
        );
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

@RestController
class MyController {
    @GetMapping("/public/info")
    public String publicInfo() {
        return "This is public information!";
    }

    @GetMapping("/secure/data")
    public String secureData() {
        return "This is secure data!";
    }
}

Perlindungan CSRF dan API REST

Perlindungan CSRF (Cross-Site Request Forgery) amat penting untuk aplikasi berasaskan pelayar. Walau bagaimanapun, bagi API REST tanpa keadaan yang biasanya digunakan oleh klien bukan pelayar (seperti aplikasi mudah alih atau perkhidmatan lain), perlindungan CSRF biasanya tidak diperlukan dan kadangkala boleh menimbulkan masalah.

Anda boleh menyahdayakannya secara jelas dalam konfigurasi keselamatan anda:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

@Configuration
@EnableWebSecurity
class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf().disable() // Disable CSRF for REST APIs
            .httpBasic();
        http.authorizeHttpRequests(authorize -> authorize
            .requestMatchers("/public/**").permitAll()
            .requestMatchers("/secure/**").authenticated()
            .anyRequest().denyAll()
        );
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

@RestController
class MyController {
    @GetMapping("/public/info")
    public String publicInfo() {
        return "This is public information!";
    }

    @GetMapping("/secure/data")
    public String secureData() {
        return "This is secure data!";
    }
}

Semakan Pantas: Capaian Keselamatan

Perhatikan SecurityConfig berikut. Apakah yang akan berlaku jika anda cuba mengakses /api/status tanpa memberikan sebarang bukti kelayakan?

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .httpBasic();
        http.authorizeHttpRequests(authorize -> authorize
            .requestMatchers("/api/public/**").permitAll()
            .requestMatchers("/api/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated()
        );
        return http.build();
    }
}

Imbas Kembali Pelajaran: Melindungi Titik Akhir

Dalam pelajaran ini, anda telah mempelajari langkah asas untuk melindungi titik akhir API REST Spring Boot anda:

  • Menambahkan kebergantungan Spring Security.
  • Memahami tingkah laku keselamatan lalai.
  • Mengkonfigurasikan SecurityFilterChain untuk mentakrifkan peraturan tersuai.
  • Menyediakan pengguna dalam memori untuk pengesahan asas.
  • Menggunakan requestMatchers() bersama-sama permitAll() dan authenticated() untuk mentakrifkan capaian bagi laluan tertentu.
  • Menyahdayakan perlindungan CSRF untuk API REST tanpa keadaan.

Pengetahuan ini penting untuk membina perkhidmatan mikro yang kukuh dan selamat!

Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
24
Pelajaran
93

Soalan Lazim

Adakah pelajaran “Melindungi Titik Akhir REST” percuma?

Ya — teks penuh “Melindungi Titik Akhir REST” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Perkhidmatan Mikro dan API REST Spring Boot 4, tingkat taraf kepada CoddyKit PRO. Kursus Perkhidmatan Mikro dan API REST Spring Boot 4 merangkumi sejumlah 3 pelajaran.

Apakah yang akan saya pelajari dalam “Melindungi Titik Akhir REST”?

Laksanakan Spring Security untuk melindungi titik akhir API REST anda daripada akses tanpa kebenaran. Anda berlatih Perkhidmatan Mikro dan API REST Spring Boot 4 menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Perkhidmatan Mikro dan API REST Spring Boot 4?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Perkhidmatan Mikro dan API REST Spring Boot 4 di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 3.

Berapa lamakah pelajaran “Melindungi Titik Akhir REST” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Perkhidmatan Mikro dan API REST Spring Boot 4 ini?

Ya. Setiap pelajaran Perkhidmatan Mikro dan API REST Spring Boot 4 menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Asas OAuth2 dan JWT
  2. Melindungi Titik Akhir REST
  3. Kawalan Akses Berasaskan Peranan
← Kembali ke Perkhidmatan Mikro dan API REST Spring Boot 4