REST-päätepisteiden suojaaminen
Toteuttakaa Spring Security REST API -päätepisteiden suojaamiseksi luvattomalta käytöltä.
REST-päätepisteiden suojaaminen on ilmainen Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-oppitunti CoddyKitissä. Tämä on oppitunti 2/3. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-kurssilla on yhteensä 3 oppituntia.
Miksi API-päätepisteet on suojattava
API:t ovat portteja sovelluksen tietoihin ja toimintoihin. Ilman asianmukaista tietoturvaa kuka tahansa voisi käyttää, muuttaa tai poistaa arkaluonteisia tietoja.
Tässä oppitunnissa opitte, miten Spring Security auttaa suojaamaan REST-rajapintanne luvattomalta käytöltä ja varmistaa, että vain oikeutetut käyttäjät voivat käyttää palveluitanne.
Spring Security: API:nne ovimies
Spring Security on tehokas ja erittäin mukautettava todennuksen ja käyttöoikeuksien hallinnan kehys. REST-rajapinnoissa se toimii kuin ovimies ja tarkistaa tunnistetiedot ennen kuin päästää pyynnöt päätepisteisiinne.
- Se käsittelee käyttäjien todennuksen (kuka olette).
- Se hallinnoi valtuutusta (mitä saatte tehdä).
- Se suojaa yleisiltä verkkosovellusten haavoittuvuuksilta.
Aloitus: riippuvuuden lisääminen
Jotta voitte integroida Spring Securityn Spring Boot -projektiinne, lisätkää sen starter-riippuvuus pom.xml-tiedostoon (jos käytätte Mavenia).
Tämä riippuvuus tuo mukanaan kaikki tarvittavat Spring Security -komponentit ja automaattisen määrityksen.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>Tietoturvan oletustoiminta
Kun Spring Security -riippuvuus on lisätty, Spring Boot -sovelluksenne suojaa automaattisesti kaikki HTTP-päätepisteet!
Kun suoritatte sovelluksen, Spring Security luo satunnaisen salasanan ja tulostaa sen konsoliin. Tarvitsette tämän salasanan sekä oletuskäyttäjänimen "user" käyttääksenne mitä tahansa päätepistettä.
Tietoturvasääntöjen mukauttaminen
Oletustietoturva on hyvä lähtökohta, mutta haluatte todennäköisesti määrittää omat sääntönne. Tämä tehdään luomalla tietoturvamääritysluokka.
Tämä luokka käyttää merkintöjä @Configuration ja @EnableWebSecurity sekä määrittää SecurityFilterChain-beanin HTTP-tietoturvan mukauttamista varten.
Kokeilkaa suorittaa tämä perusmääritys. Se edellyttää edelleen todennusta, mutta lisäämme käyttäjät seuraavaksi!
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!";
}
}Käyttäjien määrittäminen muistiin
Yksinkertaisissa sovelluksissa tai testauksessa voitte määrittää käyttäjät suoraan tietoturvamäärityksessänne käyttämällä InMemoryUserDetailsManager-beania.
Lisäämme käyttäjän nimeltä "user", jonka salasana on "password" ja rooli "USER". Huomautus: withDefaultPasswordEncoder() on tarkoitettu nopeisiin esittelyihin; tuotannossa käyttäkää vahvoja salasanakoodaajia.
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!";
}
}Päätepistekohtainen valtuutus
Voitte määrittää eri URL-malleille erilaisia tietoturvasääntöjä käyttämällä requestMatchers()-metodia. Sääntö anyRequest().authenticated() varmistaa, että kaikki muut pyynnöt edellyttävät todennusta.
Tässä määritämme /hello-päätepisteen edellyttämään todennusta, kun taas muut polut ovat julkisia.
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!";
}
}Julkiset päätepisteet permitAll()-metodilla
Joskus tarvitsette päätepisteitä, jotka eivät edellytä todennusta, kuten kuntotarkistuksen tai julkisia tietoja tarjoavan päätepisteen. Tällöin käytätte metodia .permitAll().
Järjestyksellä on väliä! Tarkempien sääntöjen (kuten /public/**) tulee olla ennen yleisempiä sääntöjä (kuten 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!";
}
}CSRF-suojaus ja REST-rajapinnat
CSRF-suojaus (Cross-Site Request Forgery) on ratkaisevan tärkeä selainpohjaisissa sovelluksissa. Tilattomissa REST-rajapinnoissa, joita yleensä käyttävät muut kuin selainasiakkaat (kuten mobiilisovellukset tai muut palvelut), CSRF-suojausta ei kuitenkaan yleensä tarvita, ja se voi joskus aiheuttaa ongelmia.
Voitte poistaa sen käytöstä nimenomaisesti tietoturvamäärityksessänne:
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!";
}
}Pikatarkistus: tietoturvakäyttöoikeudet
Tarkastelkaa seuraavaa SecurityConfig-määritystä. Mitä tapahtuu, jos yritätte käyttää osoitetta /api/status antamatta tunnistetietoja?
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();
}
}Oppitunnin kertaus: päätepisteiden suojaaminen
Tässä oppitunnissa opitte Spring Boot -pohjaisen REST-rajapinnan päätepisteiden suojaamisen perusvaiheet:
- Lisäsitte Spring Security -riippuvuuden.
- Opitte tuntemaan tietoturvan oletustoiminnan.
- Määrititte
SecurityFilterChain-ketjun mukautettujen sääntöjen määrittämistä varten. - Määrititte muistiin tallennetut käyttäjät perustodennusta varten.
- Käytitte
requestMatchers()-metodia yhdessäpermitAll()- jaauthenticated()-metodien kanssa määrittääksenne tiettyjen polkujen käyttöoikeudet. - Poistitte CSRF-suojauksen käytöstä tilattomia REST-rajapintoja varten.
Nämä tiedot ovat ratkaisevan tärkeitä vankkojen ja turvallisten mikropalveluiden rakentamisessa!
Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 24
- Oppitunnit
- 93
Usein kysytyt kysymykset
Onko oppitunti ”REST-päätepisteiden suojaaminen” ilmainen?
Kyllä – oppitunnin ”REST-päätepisteiden suojaaminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-kurssin, päivitä CoddyKit PROhon. Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-kurssilla on yhteensä 3 oppituntia.
Mitä opin oppitunnilla ”REST-päätepisteiden suojaaminen”?
Toteuttakaa Spring Security REST API -päätepisteiden suojaamiseksi luvattomalta käytöltä. Harjoittelet Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/3.
Kuinka kauan ”REST-päätepisteiden suojaaminen”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-oppitunnilla?
Kyllä. Jokainen Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- OAuth2:n ja JWT:n perusteet
- REST-päätepisteiden suojaaminen
- Roolipohjainen käyttöoikeuksien hallinta