Zaistite bezpečnosť svojej aplikácie Spring využitím robustných funkcií, ktoré ponúka framework Spring Security.
Rámec Spring Security zabezpečuje vašu aplikáciu prostredníctvom autentifikácie a autorizácie. Vo svojom predvolenom stave Spring Security zaisťuje, že každá cesta (alebo stránka) HTTP požiadavky vo vašej aplikácii vyžaduje autentifikáciu jedného globálneho užívateľa.
Tento rámec je tiež mimoriadne flexibilný. Umožňuje vám vytvoriť prispôsobené bezpečnostné pravidlá pre každú cestu požiadavky HTTP vo vašej aplikácii, ako aj pre rôznych používateľov. Môžete teda odstrániť bezpečnostné obmedzenie na stránkach, ktoré nevyžadujú autorizáciu používateľa (napríklad domovská stránka). A nastavte roly a oprávnenia konkrétnych typov používateľov.
Pridanie jarnej bezpečnosti do vašej aplikácie
Existujú dva spôsoby, ako pridať Spring Security do vašej aplikácie. Môžete si ho vybrať buď ako závislosť pri generovaní novej aplikácie Spring Boot pomocou Spring initializralebo ho po vygenerovaní projektu pridajte do súboru so špecifikáciou zostavy v sekcii závislostí.
Ak ste vybrali jednu z možností projektu Gradle, súbor závislostí je stavať.gradle. Ak ste si však vybrali Maven, potom tento súbor je pom.xml.
Váš stavať.gradle súbor by mal obsahovať nasledujúcu závislosť:
dependencies {
implementation 'org.springframework.boot: spring-boot-starter-security'
}
Kým váš pom.xml súbor by mal obsahovať nasledujúcu závislosť:
org.springframework.boot
spring-boot-starter-security
Vzorová aplikácia použitá v článku je dostupná v tomto úložisko GitHub a môžete ho bezplatne používať na základe licencie MIT.
Použitie Spring Security
Po pridaní závislosti Spring Security do vašej aplikácie môžete okamžite začať používať rámec. Jednoducho spustite svoju aplikáciu a potom prejdite na domovskú stránku Spring Boot (alebo akúkoľvek stránku vo vašej aplikácii). Vzorová aplikácia používa nasledujúci počiatočný ovládač na ovládanie predvoleného nastavenia Spring Boot localhost: 8080 žiadosť:
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!";
}
}
Spustenie vašej aplikácie po pridaní jednej triedy radiča vyššie vygeneruje nasledujúce počiatočné zobrazenie:
Všimnete si, že vás automaticky presmeruje na localhost: 8080/login a urobí to skôr, ako vám umožní prístup na akúkoľvek inú stránku aplikácie. V tejto fáze budete musieť zadať predvolené používateľské meno (čo je používateľ) a automaticky vygenerované heslo (ktoré nájdete v konzole). Konzola vygeneruje riadok podobný tomuto:
Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81
Pri každom reštartovaní aplikácie sa automaticky vygenerované heslo zmení, ale používateľské meno zostane rovnaké. Zadaním predvoleného používateľského mena a hesla budete presmerovaní na príslušné zobrazenie vo vašej aplikácii.
Prispôsobenie jarnej bezpečnosti
Ak chcete prispôsobiť zabezpečenie svojej aplikácie, budete musieť prepísať predvolenú konfiguráciu aplikácie Spring Security. Predtým však (za predpokladu, že už máte Spring Web) budete potrebovať niekoľko ďalších závislostí pre túto vzorovú aplikáciu:
- Spring Data JPA
- Ovládač MySQL JDBC
- tymiánový
- Lombok
Rámec Thymeleaf vytvorí rôzne pohľady. Lombok pomôže zredukovať kód vo vašich triedach objektov. Knižnica JPA a ovládač MySQL vám umožnia používať s aplikáciou databázu MySQL, ale máte možnosť použiť akúkoľvek databázu, ktorá vám vyhovuje. Používanie databázy znamená konfiguráciu aplikácie.vlastnosti súbor pod súborom zdrojov.
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
Vyššie uvedený konfiguračný kód vám umožňuje pripojiť sa k lokálnej databáze MySQL s názvom jarné_zabezpečenie, s používateľským menom koreňa heslo (1234). Tieto údaje budete musieť aktualizovať, aby zodpovedali názvu vašej databázy a povereniam.
Po pridaní ďalších závislostí a vytvorení databázy sa môžete začať rozhodovať o tom, koľko zobrazení bude mať vaša aplikácia. Musíte tiež vedieť, ako vyzerá zabezpečenie každej stránky. Naša vzorová aplikácia má 6 zobrazení:
- Domovská stránka
- Registračná stránka
- Prihlasovacia stránka
- Odhlasovacia stránka
- Používateľská stránka
- Chybová stránka
Jediným zobrazením, ktoré bude vyžadovať autorizáciu používateľa, je stránka používateľa. Táto stránka je prístupná iba používateľom, ktorí sa najprv zaregistrujú a potom sa prihlásia do aplikácie. Okrem predvoleného balíka Spring Boot budete musieť vo svojej aplikácii vytvoriť ďalšie štyri balíky.
Trieda správcu registrácie
Balík radiča bude obsahovať triedy, ktoré spracovávajú požiadavky HTTP. V závislosti od funkcie stránky môžete zvyčajne zoskupiť každú požiadavku HTTP do jednej triedy radiča, ako je to v prípade WebController trieda. Zobrazenie registrácie má však jedinečnejšie funkcie, takže môže mať triedu súkromného ovládača:
@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";
}
}
The RegistrationController class je bránou k bezpečnostnému aspektu vašej aplikácie. The @RequestMapping anotácia špecifikuje typ požiadavky, ktorú bude tento kontrolór spracovať (požiadavky na localhost: 8080/register).
The @GetMapping anotácia jednoducho naznačuje, že ak aplikácia dostane žiadosť o /register, Registračný formulár() metóda by mala spracovať túto požiadavku vrátením zobrazenia registrácie.
Potom, čo návštevník klikne na tlačidlo registrovať, potom na @PostMapping do hry vstupuje anotácia. The processRegistration() metóda vám umožňuje zverejniť používateľské údaje, ktoré získa z Registračný formulár triedy do databázy pomocou UserRepository trieda. Ale predtým, ako uloží tieto údaje, processRegistration() metóda šifruje heslo používateľa pomocou JarnéPasswordEncoder rozhranie.
Vytváranie nových konfigurácií zabezpečenia
Od jari 3.1 môžu teraz vývojári vytvárať konfigurácie pre Spring Security pomocou Java, čo znamená triedy namiesto XML. Hlavná vec, ktorú tieto konfiguračné triedy vyžadujú, je @Konfigurácia anotácia.
@Configuration
publicclassSecurityConfiguration{
}
The @Konfigurácia anotácia označuje, že trieda vyššie je trieda konfigurácie. Tieto triedy poskytujú fazuľu Kontext jarnej aplikácie, čo je kontajner, ktorý Spring používa na vytváranie a správu rôznych komponentov (alebo fazulí) aplikácie. Prvá fazuľa v SecurityConfiguration trieda je passwordEncoder fazuľa.
@Bean
public PasswordEncoder passwordEncoder(){
returnnew BCryptPasswordEncoder();
}
The RegistrationController trieda používa passwordEncoder bean na zakódovanie nových hesiel pred ich uložením do databázy. Ďalšia dôležitá fazuľa, ktorú budete musieť pridať do SecurityConfiguration trieda je userDetailsService fazuľa.
@Bean
public UserDetailsService userDetailsService(UserRepository userRepo){
return username -> {
Customer customer = userRepo.findByUsername(username);
if (customer != null)
return customer;
thrownew UsernameNotFoundException("Customer '" + username + "' not found");
};
}
The userDetailsService fazuľa zamestnáva Jarná bezpečnosťUserDetailsService rozhranie na získanie používateľského mena a hesla používateľa na overenie počas prihlasovacej relácie zákazníka. Takže, akonáhle zákazník klikne na tlačidlo prihlásenia v zobrazení prihlásenia, userDetailsService fazuľa sa dáva do pohybu.
Cez UserRepository, userDetailsService bean získa prístup ku všetkým existujúcim zákazníkom v databáze. Toto rozhranie potom používa UserRepository na vyhľadanie používateľa so zodpovedajúcim používateľským menom a heslom, potom vráti všetky atribúty tohto zákazníka ako objekt.
Ak je vráteným objektom zákazník, potom tento zákazník získa prístup k aplikácii. V opačnom prípade sa stránka automaticky obnoví a umožní používateľovi zadať platné poverenia.
Reťaz filtrov
Jarná bezpečnosťSecurityFilterChain rozhranie je užitočné aplikačné programové rozhranie (API) ktorý hrá zásadnú úlohu v konfigurácii Spring Security. Toto rozhranie pracuje s Jarná bezpečnosťZabezpečenie HTTP triedy na vytvorenie reťazca filtrov pre konkrétne požiadavky HTTP.
@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();
}
The filterChain fazuľa vyššie používa SecurityFilterChain API na vykonanie niekoľkých úloh. Po prvé, používa Zabezpečenie HTTP trieda diktovať, že prístup majú iba používatelia, ktorí majú rolu USER localhost: 8080/používateľ. A používateľ získa túto rolu po registrácii vďaka getAuthorities() metódu, ktorú implementuje každý nový objekt zákazníka.
@Override
public Collection extends="extends" grantedauthority="grantedauthority"?> getAuthorities() {
return Arrays.asList(new SimpleGrantedAuthority("USER"));
}
Reťazec filtrov umožňuje neoverený prístup ku všetkým ostatným adresám URL v aplikácii. The filterChain fazuľa tiež využíva formLogin() a odhlásiť sa() metódy Zabezpečenie HTTP objekt triedy.
Tieto metódy vám umožňujú automaticky nasmerovať používateľa na konkrétne stránky po vykonaní úlohy. Takže používateľ, ktorý zadá správne poverenia a klikne na tlačidlo prihlásenia na /login stránka bude automaticky presmerovaná na /user stránku.
Nakoniec, filterChain bean vytvára a vracia reťazec filtrov, čo umožňuje oprávneným používateľom prístup k aplikácii. Všetky tri fazule v SecurityConfiguration trieda spolupracovať na zabezpečení vašej aplikácie.
Avšak, filterChain fazuľa hrá významnejšiu úlohu pri diktovaní úrovne autorizácie každú požiadavku HTTP. Keď začnete do aplikácie pridávať ďalšie stránky, môžete použiť filterChain bean na nastavenie ich úrovne zabezpečenia.
Hlavná výhoda jarnej bezpečnosti
Spring Security vám dáva úplnú kontrolu nielen nad tým, kto má prístup k vašej aplikácii, ale aj nad typom prístupu, ktorý môže mať používateľ (prostredníctvom funkcie jeho používateľských rolí). Kontrola prístupu je jedným z najdôležitejších aspektov akejkoľvek aplikácie. Poskytnutie nefiltrovaného prístupu k vašej aplikácii bežným používateľom z dôvodu obmedzených prekážok riadenia prístupu sa môže ukázať ako nákladná chyba.