Gondoskodjon Spring alkalmazásának biztonságáról a Spring Security keretrendszer által kínált robusztus funkciók kihasználásával.
A Spring Security keretrendszer hitelesítéssel és engedélyezéssel védi az alkalmazást. Alapértelmezett állapotában a Spring Security biztosítja, hogy az alkalmazásban minden HTTP-kérési útvonal (vagy oldal) egyetlen globális felhasználó hitelesítését igényli.
Ez a keret is rendkívül rugalmas. Lehetővé teszi testreszabott biztonsági szabályok létrehozását az alkalmazás minden HTTP-kérési útvonalához, valamint a különböző felhasználókhoz. Így eltávolíthatja a biztonsági korlátozást azokon az oldalakon, amelyek nem igényelnek felhasználói engedélyt (például a kezdőlapon). És állítsa be az adott felhasználótípusok szerepköreit és jogosultságait.
Tavaszi biztonság hozzáadása az alkalmazáshoz
Kétféleképpen adhatja hozzá a Spring Security-t az alkalmazásához. Új Spring Boot alkalmazás generálásakor függőségként is kiválaszthatja a tavaszi inicializálást használva, vagy adja hozzá a build specifikációs fájljához a függőségi szakaszban a projekt létrehozása után.
Ha a Gradle projekt egyik opcióját választotta, akkor a függőségi fájl az build.gradle. Ha azonban a Maven-t választotta, akkor az a fájl pom.xml.
A te build.gradle a fájlnak a következő függőséget kell tartalmaznia:
dependencies {
implementation 'org.springframework.boot: spring-boot-starter-security'
}
Míg a pom.xml a fájlnak a következő függőséget kell tartalmaznia:
org.springframework.boot
spring-boot-starter-security
A cikkben használt minta alkalmazás itt érhető el GitHub adattár és az MIT licence alapján ingyenesen használható.
A Spring Security használata
Miután hozzáadta a Spring Security függőséget az alkalmazáshoz, azonnal elkezdheti használni a keretrendszert. Egyszerűen futtassa az alkalmazást, majd navigáljon a Spring Boot kezdőlapjára (vagy az alkalmazás bármely oldalára). A példaalkalmazás a következő kezdeti vezérlőt használja a Spring Boot alapértelmezésének vezérléséhez localhost: 8080 kérés:
package com.springSecurityDemo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
publicclassWebController{
@GetMapping("/")
public String home(){
return"Welcome!";
}
}
Az alkalmazás végrehajtása a fenti egyetlen vezérlőosztály hozzáadása után a következő kezdeti nézetet generálja:
Észre fogja venni, hogy automatikusan a localhost: 8080/bejelentkezés oldalon, és ezt azelőtt teszi meg, hogy lehetővé tenné az alkalmazás bármely más oldalának elérését. Ebben a szakaszban meg kell adnia az alapértelmezett felhasználónevet (ami a felhasználó) és az automatikusan generált jelszót (amelyet a konzolon talál meg). A konzol a következőhöz hasonló sort generál:
Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81
Minden alkalommal, amikor újraindítja az alkalmazást, az automatikusan generált jelszó megváltozik, de a felhasználónév ugyanaz marad. Az alapértelmezett felhasználónév és jelszó megadása az alkalmazás megfelelő nézetére irányítja Önt.
A tavaszi biztonság személyre szabása
Az alkalmazás biztonságának testreszabásához felül kell írnia a Spring Security alapértelmezett konfigurációját. De előtte (feltételezve, hogy már rendelkezik Spring Web-el) több más függőségre lesz szüksége ehhez a példaalkalmazáshoz:
- Spring Data JPA
- MySQL JDBC illesztőprogram
- kakukkfű
- Lombok
A Thymeleaf keretrendszer különböző nézeteket generál. A Lombok segít csökkenteni a kódot az objektumosztályaiban. A JPA-könyvtár és a MySQL-illesztőprogram lehetővé teszi MySQL-adatbázis használatát az alkalmazással, de lehetősége van bármely olyan adatbázis használatára, amelyik kényelmes. Az adatbázis használata azt jelenti, hogy be kell állítani a alkalmazások.tulajdonságok fájlt az erőforrásfájl alatt.
spring.datasource.url=jdbc: mysql://${MYSQL_HOST: localhost}:3306/spring_security
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
A fenti konfigurációs kód lehetővé teszi a helyi MySQL adatbázishoz való csatlakozást tavasz_biztonság, felhasználónévvel gyökér, és jelszó (1234). Frissítenie kell ezeket az adatokat, hogy megfeleljenek az adatbázis nevének és hitelesítő adatainak.
A további függőségek hozzáadása és az adatbázis létrehozása után elkezdheti eldönteni, hogy az alkalmazás hány nézetű legyen. Azt is tudnia kell, hogyan néz ki az egyes oldalak biztonsága. A minta alkalmazásunk 6 nézetet tartalmaz:
- Kezdőlap
- Regisztrációs oldal
- Bejelentkezési oldal
- Kijelentkezési oldal
- Felhasználói oldal
- Hibaoldal
Az egyetlen nézet, amelyhez felhasználói jogosultság szükséges, az a felhasználói oldal. Ezt az oldalt csak azok a felhasználók érhetik el, akik először regisztrálnak, majd bejelentkeznek az alkalmazásba. A Spring Boot alapértelmezett csomagján kívül további négy csomagot kell létrehoznia az alkalmazásban.
A regisztrációs vezérlő osztály
A vezérlőcsomag tartalmazza a HTTP kéréseket kezelő osztályokat. Egy oldal funkciójától függően általában minden HTTP-kérést egy vezérlőosztályba csoportosíthat, ahogy az a WebController osztály. A regisztrációs nézet azonban egyedibb funkciókkal rendelkezik, így lehet privát vezérlőosztálya:
@Controller
@RequestMapping("/register")
publicclassRegistrationController{
private UserRepository userRepo;
private PasswordEncoder passwordEncoder;
publicRegistrationController( UserRepository userRepo, PasswordEncoder passwordEncoder){
this.userRepo = userRepo;
this.passwordEncoder = passwordEncoder;
}
@GetMapping
public String registerForm(){
return"registration";
}
@PostMapping
public String processRegistration(RegistrationForm form){
userRepo.save(form.toUser(passwordEncoder));
return"redirect:/login";
}
}
A Regisztrációvezérlő osztály egy átjáró az alkalmazás biztonsági vonatkozásaihoz. A @RequestMapping az annotáció megadja a kérés típusát, amelyet ez a vezérlő kezelni fog (kérések localhost: 8080/regiszter).
A @GetMapping megjegyzés egyszerűen azt jelzi, hogy ha az alkalmazás kérést kap a /register, a regisztrációs űrlap() metódusnak a regisztrációs nézet visszaadásával kell kezelnie a kérést.
Miután a látogató rákattint a regisztráció gombra, majd a @PostMapping az annotáció lép működésbe. A folyamatRegisztráció() módszer lehetővé teszi a felhasználói adatok közzétételét, amelyeket a Regisztrációs űrlap osztályt az adatbázisba, a UserRepository osztály. Mielőtt azonban ezeket az adatokat tárolná, a folyamatRegisztráció() módszer segítségével titkosítja a felhasználó jelszavát A tavaszéPasswordEncoder felület.
Új biztonsági konfigurációk létrehozása
A Spring 3.1 óta a fejlesztők már létrehozhatnak konfigurációkat a Spring Security számára Java használatával, ami XML helyett osztályokat jelent. A legfontosabb dolog, amit ezek a konfigurációs osztályok igényelnek, az @Konfiguráció annotáció.
@Configuration
publicclassSecurityConfiguration{
}
A @Konfiguráció az annotáció azt jelzi, hogy a fenti osztály konfigurációs osztály. Ezek az osztályok babot biztosítanak a Tavaszi alkalmazási környezet, amely egy tároló, amelyet a Spring egy alkalmazás különböző összetevőinek (vagy komponenseinek) létrehozására és kezelésére használ. Az első bab a Biztonsági konfiguráció osztály az passwordEncoder bab.
@Bean
public PasswordEncoder passwordEncoder(){
returnnew BCryptPasswordEncoder();
}
A Regisztrációvezérlő osztály használja a passwordEncoder bean új jelszavak kódolásához, mielőtt elmentené őket az adatbázisba. Egy másik fontos bab, amelyet hozzá kell adnia Biztonsági konfiguráció osztály az userDetailsService bab.
@Bean
public UserDetailsService userDetailsService(UserRepository userRepo){
return username -> {
Customer customer = userRepo.findByUsername(username);
if (customer != null)
return customer;
thrownew UsernameNotFoundException("Customer '" + username + "' not found");
};
}
A userDetailsService bab alkalmaz A tavaszi biztonságUserDetailsService felület a felhasználó felhasználónevének és jelszavának lekéréséhez a hitelesítéshez az ügyfél bejelentkezési munkamenete során. Tehát amint az ügyfél a bejelentkezési nézetben a bejelentkezés gombra kattint, a userDetailsService bab mozgásba lendül.
Keresztül UserRepository, a userDetailsService A bean hozzáférést kap az adatbázisban lévő összes meglévő ügyfélhez. Ez az interfész ezután a UserRepository hogy megkeresse a megfelelő felhasználónévvel és jelszóval rendelkező felhasználót, majd objektumként adja vissza az ügyfél összes attribútumait.
Ha a visszaküldött objektum egy ügyfél, akkor ez az ügyfél hozzáfér az alkalmazáshoz. Ellenkező esetben az oldal automatikusan frissül, lehetővé téve a felhasználó számára, hogy érvényes hitelesítő adatokat adjon meg.
A szűrőlánc
Spring SecuritySecurityFilterChain hasznos felület alkalmazásprogramozási felület (API) amely alapvető szerepet játszik a Spring Security konfigurációjában. Ez a felület működik A tavaszi biztonságHttpSecurity osztályt, hogy szűrőláncot hozzon létre adott HTTP-kérésekhez.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http)throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/user").hasAuthority("USER").anyRequest().permitAll())
.formLogin(formLogin -> formLogin
.loginPage("/login").defaultSuccessUrl("/user", true))
.logout(logout -> logout.logoutSuccessUrl("/logout"));
return http.build();
}
A szűrőlánc bab fenti használja a SecurityFilterChain API több feladat elvégzésére. Először is a HttpSecurity osztályt, hogy megszabja, hogy csak a FELHASZNÁLÓ szerepkörrel rendelkező felhasználók férhessenek hozzá localhost: 8080/felhasználó. A felhasználó pedig regisztráció után kapja meg ezt a szerepet, köszönhetően a getAuthorities() módszer, amelyet minden új ügyfélobjektum implementál.
@Override
public Collection extends="extends" grantedauthority="grantedauthority"?> getAuthorities() {
return Arrays.asList(new SimpleGrantedAuthority("USER"));
}
A szűrőlánc lehetővé teszi a hitelesítés nélküli hozzáférést az alkalmazás összes többi URL-jéhez. A szűrőlánc bab is hasznosítja a formLogin() és Kijelentkezés() módszerei a HttpSecurity osztályú objektum.
Ezek a módszerek lehetővé teszik, hogy a felhasználót egy feladat végrehajtása után automatikusan meghatározott oldalakra irányítsa. Tehát egy felhasználó, aki megadja a megfelelő hitelesítő adatokat, és rákattint a bejelentkezés gombra /login oldal automatikusan a /user oldalon.
Végül a szűrőlánc A bean összeállítja és visszaadja a szűrőláncot, amely lehetővé teszi a jogosult felhasználók számára az alkalmazás elérését. Mindhárom bab a Biztonsági konfiguráció osztály dolgozzon együtt a jelentkezés biztonsága érdekében.
Azonban a szűrőlánc a bean játssza a jelentősebb szerepet a jogosultsági szint megszabásában minden HTTP kérés. Ahogy elkezd több oldalt hozzáadni az alkalmazáshoz, használhatja a szűrőlánc bean biztonsági szint beállításához.
A tavaszi biztonság fő előnye
A Spring Security teljes körű ellenőrzést biztosít nemcsak a felett, hogy ki férhet hozzá az alkalmazásához, hanem azt is, hogy a felhasználó milyen típusú hozzáféréssel rendelkezhet (a felhasználói szerepkörei révén). A hozzáférés-szabályozás minden alkalmazás egyik legfontosabb szempontja. A korlátozott hozzáférés-szabályozási akadályok miatt az általános felhasználók szűretlen hozzáférést biztosítanak az alkalmazáshoz, és költséges hibának bizonyulhat.