Todentaminen Spring Securitylla
Integroikaa Spring Security GraphQL-päätepisteiden suojaamiseksi ja käyttäjien todentamisen hallitsemiseksi.
Todentaminen Spring Securitylla on ilmainen GraphQL-rajapinnat Spring Bootilla-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. 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 GraphQL-rajapinnat Spring Bootilla-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. GraphQL-rajapinnat Spring Bootilla-kurssilla on yhteensä 4 oppituntia.
Miksi GraphQL tarvitsee todennusta?
Tervetuloa! Tässä oppitunnissa yhdistämme Spring Securityn GraphQL-ohjelmointirajapintaamme. GraphQL määrittää, miten tietoja kysellään ja muokataan, mutta se ei määritä todennusta tai käyttöoikeuksien hallintaa.
Ohjelmointirajapinnan suojaaminen on tärkeää, jotta vain valtuutetut käyttäjät voivat käyttää arkaluonteisia tietoja ja suorittaa tiettyjä toimintoja. Spring Security on tähän tehokas ja joustava kehys.
Spring Securityn perusteet
Spring Security on kattava Spring-sovellusten tietoturvakehys. Se tarjoaa autentikoinnin (sen varmistamisen, kuka olet) ja valtuutuksen (mihin sinulla on oikeus).
- Autentikointi: Varmistaa käyttäjän henkilöllisyyden (esimerkiksi käyttäjänimen ja salasanan avulla).
- Valtuutus: Määrittää, onko autentikoidulla käyttäjällä oikeus käyttää resurssia tai suorittaa toiminto.
Aloitamme perusautentikoinnista, joka on helppo ottaa käyttöön testausta varten.
Lisää tietoturvariippuvuus
Ensin meidän on lisättävä Spring Security -starter-riippuvuus Spring Boot -projektiimme. Se tuo käyttöön kaikki tietoturvaan tarvittavat komponentit.
Lisää seuraava sisältö pom.xml-tiedostoon:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>Muista lisätä myös GraphQL-starter, esimerkiksi spring-boot-starter-graphql, jos et ole vielä tehnyt sitä.
Määritä perustason muistinsisäinen autentikointi
Nopeaa aloitusta varten Spring Security voi käyttää muistinsisäisiä käyttäjätietoja. Määritämme SecurityFilterChain-beanin HTTP-tietoturvasääntöjen määrittämistä varten.
Tämä määritys luo kaksi käyttäjää: 'user' ja 'admin'. Molempien salasana on 'password' (BCryptillä koodattuna), mutta niillä on eri roolit.
package com.coddykit;
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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.anyRequest().authenticated()
)
.httpBasic();
return http.build();
}
@Bean
public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
UserDetails user = User.builder()
.username("user")
.password(passwordEncoder.encode("password"))
.roles("USER")
.build();
UserDetails admin = User.builder()
.username("admin")
.password(passwordEncoder.encode("password"))
.roles("ADMIN", "USER")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}GraphQL-polkujen suojaaminen
Suojataan nyt GraphQL-päätepisteet nimenomaisesti. Haluamme varmistaa, että vain autentikoidut käyttäjät voivat käyttää /graphql-päätepistettä, jossa API:mme sijaitsee.
Voimme muokata SecurityFilterChain-ketjua tiettyjen polkujen käyttöoikeussääntöjen määrittämistä varten. Voimme esimerkiksi vaatia GraphQL:n käyttämiseen 'USER'-roolin.
package com.coddykit;
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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable()) // Disable CSRF for API (consider for production)
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/graphql/**", "/graphiql/**").hasAnyRole("USER", "ADMIN")
.anyRequest().authenticated()
)
.httpBasic();
return http.build();
}
@Bean
public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
UserDetails user = User.builder()
.username("user")
.password(passwordEncoder.encode("password"))
.roles("USER")
.build();
UserDetails admin = User.builder()
.username("admin")
.password(passwordEncoder.encode("password"))
.roles("ADMIN", "USER")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}Yksinkertainen GraphQL-kysely
Testataan tietoturvaa luomalla hyvin yksinkertainen GraphQL-kysely. Tämä kysely palauttaa vain tervehdyksen. Kokeilemme sitten sen käyttöä sekä autentikoituna että ilman autentikointia.
Tämä havainnollistaa minimaalista GraphQL-API:a, jonka Spring Security suojaa.
package com.coddykit;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;
@Controller
public class GreetingController {
@QueryMapping
public String hello() {
return "Hello, secured GraphQL world!";
}
}Kokonainen suojatun sovelluksen esimerkki
Tässä on täydellinen Spring Boot -sovellus, jossa Spring Security on integroitu GraphQL-päätepisteeseen. Suorita tämä koodi ja yritä sitten käyttää osoitetta http://localhost:8080/graphql tai polkua /graphiql.
Sinulta pitäisi pyytää käyttäjänimeä ja salasanaa (esimerkiksi 'user'/'password'). Ilman niitä käyttö evätään.
package com.coddykit;
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.graphql.data.method.annotation.QueryMapping;
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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.stereotype.Controller;
@SpringBootApplication
public class SecuredGraphQLApp {
public static void main(String[] args) {
SpringApplication.run(SecuredGraphQLApp.class, args);
}
}
@Controller
class GreetingController {
@QueryMapping
public String hello() {
return "Hello, secured GraphQL world!";
}
}
@Configuration
@EnableWebSecurity
class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/graphql/**", "/graphiql/**").hasAnyRole("USER", "ADMIN")
.anyRequest().authenticated()
)
.httpBasic();
return http.build();
}
@Bean
public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
UserDetails user = User.builder()
.username("user")
.password(passwordEncoder.encode("password"))
.roles("USER")
.build();
UserDetails admin = User.builder()
.username("admin")
.password(passwordEncoder.encode("password"))
.roles("ADMIN", "USER")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}Mukautettu UserDetailsService
Muistinsisäiset käyttäjät sopivat hyvin kehitykseen, mutta oikeiden sovellusten on ladattava käyttäjätiedot tietokannasta tai ulkoisesta palvelusta. Tässä mukautettu UserDetailsService tulee käyttöön.
Toteuttaisit tämän rajapinnan käyttäjätietojen (käyttäjänimen, salasanan ja roolien) hakemista varten annetun käyttäjänimen perusteella. Spring Security käyttää näitä tietoja käyttäjän autentikointiin.
package com.coddykit;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.crypto.password.PasswordEncoder;
@Service
public class MyCustomUserDetailsService implements UserDetailsService {
private final PasswordEncoder passwordEncoder;
public MyCustomUserDetailsService(PasswordEncoder passwordEncoder) {
this.passwordEncoder = passwordEncoder;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// In a real app, you'd fetch this from a DB
// For demonstration, let's hardcode a user
if ("coddy".equals(username)) {
return User.builder()
.username("coddy")
.password(passwordEncoder.encode("secret")) // Stored encoded password
.roles("USER")
.build();
} else {
throw new UsernameNotFoundException("User not found: " + username);
}
}
}PasswordEncoderin ymmärtäminen
Älä koskaan tallenna salasanoja selväkielisinä! PasswordEncoder on rajapinta salasanojen koodaamiseen ja tarkistamiseen. BCryptPasswordEncoder on vahva ja laajalti suositeltu toteutus.
- Koodaus: Muuntaa selväkielisen salasanan suojatuksi tiivisteeksi.
- Täsmäytys: Vertaa raakaa salasanaa koodattuun salasanaan.
Spring Security käyttää automaattisesti antamaasi PasswordEncoder-beania salasanojen tarkistamiseen.
Tietoturvan integroinnin tarkistus
Olet oppinut määrittämään GraphQL-API:lle perustason autentikoinnin. Testataan, miten hyvin hallitset keskeiset komponentit.
Oppitunnin kertaus: suojaa API:si
Hienoa työtä! Olet oppinut integroimaan Spring Securityn GraphQL-päätepisteiden suojaamista varten. Käsittelimme seuraavat aiheet:
- Autentikoinnin merkitys GraphQL-API:en yhteydessä.
- Spring Security -riippuvuuden lisääminen.
SecurityFilterChain-ketjun määrittäminen perustason autentikointia varten.- Tiettyjen GraphQL-polkujen suojaaminen.
- Mukautetun
UserDetailsService-palvelun toteuttaminen todellisten sovellusten käyttäjähallintaa varten. PasswordEncoder-komponentin käyttäminen salasanojen turvalliseen käsittelyyn.
Tämä luo perustan vankkojen ja turvallisten GraphQL-API:en rakentamiselle. Seuraavaksi tutustut valtuutukseen, jolla hallitaan kenttien ja toimintojen käyttöoikeuksia!
Opi GraphQL-rajapinnat Spring Bootilla 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
- 12
- Oppitunnit
- 48
Usein kysytyt kysymykset
Onko oppitunti ”Todentaminen Spring Securitylla” ilmainen?
Kyllä – oppitunnin ”Todentaminen Spring Securitylla” 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 GraphQL-rajapinnat Spring Bootilla-kurssin, päivitä CoddyKit PROhon. GraphQL-rajapinnat Spring Bootilla-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Todentaminen Spring Securitylla”?
Integroikaa Spring Security GraphQL-päätepisteiden suojaamiseksi ja käyttäjien todentamisen hallitsemiseksi. Harjoittelet GraphQL-rajapinnat Spring Bootilla-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni GraphQL-rajapinnat Spring Bootilla-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin GraphQL-rajapinnat Spring Bootilla-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Todentaminen Spring Securitylla”-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ä GraphQL-rajapinnat Spring Bootilla-oppitunnilla?
Kyllä. Jokainen GraphQL-rajapinnat Spring Bootilla-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
- GraphQL:n mukautettu virheenkäsittely
- Todentaminen Spring Securitylla
- Valtuutus direktiiveillä ja kontekstilla
- Pyyntömäärien rajoitus ja kyselysyvyyden suojaus