Zajistěte zabezpečení své aplikace Spring využitím robustních funkcí, které nabízí framework Spring Security.
Framework Spring Security zabezpečuje vaši aplikaci prostřednictvím ověřování a autorizace. Ve výchozím stavu Spring Security zajišťuje, že každá cesta požadavku HTTP (nebo stránka) ve vaší aplikaci vyžaduje ověření jednoho globálního uživatele.
Tento rámec je také extrémně flexibilní. Umožňuje vám vytvořit přizpůsobená pravidla zabezpečení pro každou cestu požadavku HTTP ve vaší aplikaci a také pro různé uživatele. Můžete tedy odstranit bezpečnostní omezení na stránkách, které nevyžadují autorizaci uživatele (jako je domovská stránka). A nastavte role a oprávnění konkrétních typů uživatelů.
Přidání Spring Security do vaší aplikace
Existují dva způsoby, jak přidat Spring Security do vaší aplikace. Buď ji můžete vybrat jako závislost při generování nové aplikace Spring Boot pomocí Spring initializrnebo jej po vygenerování projektu přidejte do souboru specifikace sestavení v sekci závislostí.
Pokud jste vybrali jednu z možností projektu Gradle, pak soubor závislostí je build.gradle. Pokud jste však vybrali Maven, pak tento soubor je pom.xml.
Vaše build.gradle soubor by měl obsahovat následující závislost:
dependencies {
implementation 'org.springframework.boot: spring-boot-starter-security'
}
Zatímco vaše pom.xml soubor by měl obsahovat následující závislost:
org.springframework.boot
spring-boot-starter-security
Ukázková aplikace použitá v článku je k dispozici zde úložiště GitHub a můžete jej používat zdarma pod licencí MIT.
Použití Spring Security
Jakmile do své aplikace přidáte závislost Spring Security, můžete framework okamžitě začít používat. Jednoduše spusťte aplikaci a poté přejděte na domovskou stránku Spring Boot (nebo jakoukoli stránku ve vaší aplikaci). Ukázková aplikace používá k ovládání výchozího nastavení Spring Boot následující počáteční řadič localhost: 8080 žádost:
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!";
}
}
Spuštění aplikace po přidání jedné třídy řadiče výše vygeneruje následující počáteční pohled:
Všimnete si, že vás automaticky přesměruje na localhost: 8080/login a provede to předtím, než vám umožní přístup k jakékoli jiné stránce aplikace. V této fázi budete muset zadat výchozí uživatelské jméno (což je uživatel) a automaticky vygenerované heslo (které najdete v konzole). Konzole vygeneruje řádek jako je tento:
Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81
Při každém restartu aplikace se automaticky vygenerované heslo změní, ale uživatelské jméno zůstane stejné. Zadáním výchozího uživatelského jména a hesla budete přesměrováni na příslušné zobrazení ve vaší aplikaci.
Přizpůsobení Spring Security
Chcete-li přizpůsobit zabezpečení aplikace, budete muset přepsat výchozí konfiguraci Spring Security. Ale předtím (za předpokladu, že již máte Spring Web) budete pro tuto ukázkovou aplikaci potřebovat několik dalších závislostí:
- Spring Data JPA
- Ovladač MySQL JDBC
- tymiánový
- Lombok
Rámec Thymeleaf bude generovat různé pohledy. Lombok pomůže snížit kód ve vašich třídách objektů. Knihovna JPA a ovladač MySQL vám umožní používat s aplikací databázi MySQL, ale máte možnost použít jakoukoli databázi, která vám vyhovuje. Použití databáze znamená konfiguraci aplikace.vlastnosti soubor pod souborem zdrojů.
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
Výše uvedený konfigurační kód vám umožňuje připojit se k místní databázi MySQL s názvem jarní_zabezpečení, s uživatelským jménem vykořenita heslo (1234). Tato data budete muset aktualizovat, aby odpovídala názvu vaší databáze a přihlašovacím údajům.
Po přidání dalších závislostí a vytvoření databáze se můžete začít rozhodovat, kolik zobrazení bude mít vaše aplikace. Budete také potřebovat vědět, jak vypadá zabezpečení každé stránky. Naše ukázková aplikace má 6 zobrazení:
- Domovská stránka
- Registrační stránka
- Přihlašovací stránka
- Odhlašovací stránka
- Uživatelská stránka
- Chybová stránka
Jediný pohled, který bude vyžadovat autorizaci uživatele, je stránka uživatele. Tato stránka je přístupná pouze uživatelům, kteří se nejprve zaregistrují a poté se přihlásí do aplikace. Kromě výchozího balíčku Spring Boot budete muset ve své aplikaci vytvořit čtyři další balíčky.
Třída registračního správce
Balíček řadiče bude obsahovat třídy, které zpracovávají požadavky HTTP. V závislosti na funkci stránky můžete obvykle seskupit každý požadavek HTTP do jedné třídy řadiče, jako je tomu u WebController třída. Zobrazení registrace má však více jedinečných funkcí, takže může mít třídu soukromého ovladače:
@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ší aplikace. The @RequestMapping anotace určuje typ požadavku, který bude tento kontrolér zpracovávat (požadavky na localhost: 8080/registrovat).
The @GetMapping anotace jednoduše označuje, že pokud aplikace obdrží požadavek na /register, Registrační formulář() metoda by měla zpracovat tento požadavek vrácením zobrazení registrace.
Poté, co návštěvník klikne na tlačítko registrace, poté na @PostMapping do hry vstupuje anotace. The processRegistration() metoda umožňuje zveřejnit uživatelská data, která získá z Registrační formulář třídy do databáze pomocí UserRepository třída. Než však tato data uloží, processRegistration() metoda zašifruje heslo uživatele pomocí JarníPasswordEncoder rozhraní.
Vytváření nových konfigurací zabezpečení
Od Spring 3.1 mohou nyní vývojáři vytvářet konfigurace pro Spring Security pomocí Javy, což znamená třídy místo XML. Hlavní věc, kterou tyto konfigurační třídy vyžadují, je @Konfigurace anotace.
@Configuration
publicclassSecurityConfiguration{
}
The @Konfigurace anotace označuje, že výše uvedená třída je konfigurační třída. Tyto třídy poskytují fazole Kontext jarní aplikace, což je kontejner, který Spring používá k vytváření a správě různých komponent (nebo fazolí) aplikace. První fazole v SecurityConfiguration třída je passwordEncoder fazole.
@Bean
public PasswordEncoder passwordEncoder(){
returnnew BCryptPasswordEncoder();
}
The RegistrationController třída používá passwordEncoder bean pro zakódování nových hesel před jejich uložením do databáze. Další důležitá fazole, kterou budete muset přidat do SecurityConfiguration třída je userDetailsService fazole.
@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 bean zaměstnává Jarní bezpečnostUserDetailsService rozhraní pro načtení uživatelského jména a hesla uživatele pro ověření během přihlašovací relace zákazníka. Jakmile tedy zákazník klikne na tlačítko přihlášení v zobrazení přihlášení, userDetailsService fazole se dají do pohybu.
Skrz UserRepository, userDetailsService bean získá přístup ke všem stávajícím zákazníkům v databázi. Toto rozhraní pak používá UserRepository k vyhledání uživatele s odpovídajícím uživatelským jménem a heslem, pak vrátí všechny atributy tohoto zákazníka jako objekt.
Pokud je vráceným objektem zákazník, pak tento zákazník získá přístup k aplikaci. V opačném případě se stránka automaticky obnoví a umožní uživateli zadat platné přihlašovací údaje.
Řetěz filtrů
Jarní bezpečnostSecurityFilterChain rozhraní je užitečné aplikační programovací rozhraní (API) který hraje zásadní roli v konfiguraci Spring Security. Toto rozhraní pracuje s Jarní bezpečnostZabezpečení HTTP třídy k vytvoření řetězce filtrů pro konkrétní požadavky 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 bean výše používá SecurityFilterChain API pro provádění několika úkolů. Za prvé, používá Zabezpečení HTTP třídy diktovat, že přístup mají pouze uživatelé, kteří mají roli UŽIVATEL localhost: 8080/uživatel. A uživatel získá tuto roli po registraci díky getAuthorities() metoda, kterou implementuje každý nový objekt zákazníka.
@Override
public Collection extends="extends" grantedauthority="grantedauthority"?> getAuthorities() {
return Arrays.asList(new SimpleGrantedAuthority("USER"));
}
Řetězec filtrů umožňuje neověřený přístup ke všem ostatním adresám URL v aplikaci. The filterChain fazole také využívá formLogin() a odhlásit se() metody Zabezpečení HTTP objekt třídy.
Tyto metody vám umožňují automaticky nasměrovat uživatele na konkrétní stránky poté, co provede úlohu. Tedy uživatel, který zadá správné přihlašovací údaje a klikne na tlačítko přihlášení na /login stránka bude automaticky přesměrována na /user strana.
Konečně, filterChain bean vytváří a vrací řetězec filtrů, který umožňuje oprávněným uživatelům přístup k aplikaci. Všechny tři fazole v SecurityConfiguration třída spolupracovat na zabezpečení vaší aplikace.
Nicméně, filterChain fazole hraje významnější roli při diktování úrovně autorizace každý požadavek HTTP. Jakmile začnete do aplikace přidávat další stránky, můžete použít filterChain bean pro nastavení jejich úrovně zabezpečení.
Hlavní výhoda jarní bezpečnosti
Spring Security vám dává úplnou kontrolu nejen nad tím, kdo má přístup k vaší aplikaci, ale také nad typem přístupu, který může mít uživatel (prostřednictvím funkce jeho uživatelských rolí). Řízení přístupu je jedním z nejdůležitějších aspektů každé aplikace. Poskytnout obecným uživatelům nefiltrovaný přístup k vaší aplikaci kvůli omezeným bariérám řízení přístupu se může ukázat jako nákladná chyba.