Uvod u proljetnu sigurnost u oblaku

1. Pregled

Modul Spring Cloud Security pruža značajke povezane sa zaštitom na temelju tokena u aplikacijama Spring Boot.

Točnije, olakšava SSO zasnovan na OAuth2 - s podrškom za prenošenje tokena između poslužitelja resursa, kao i konfiguriranjem provjere autentičnosti nizvodno pomoću ugrađenog Zuul proxyja.

U ovom ćemo kratkom članku pogledati kako možemo konfigurirati ove značajke pomoću klijentske aplikacije Spring Boot, Autorizacijskog poslužitelja i REST API-ja koji rade kao Resursni poslužitelj.

Imajte na umu da za ovaj primjer imamo samo jednu klijentsku aplikaciju koja koristi SSO za demonstraciju sigurnosnih značajki u oblaku - ali u tipičnom scenariju imali bismo najmanje dvije klijentske aplikacije kako bismo opravdali potrebu za jedinstvenom prijavom.

2. Brzo pokretanje aplikacije Cloud Security

Krenimo od konfiguriranje SSO-a u Spring Boot aplikaciji.

Prvo, moramo dodati proljeće-oblak-starter-oauth2 ovisnost:

 org.springframework.cloud proljeće-oblak-starter-oauth2 2.2.2.OBLAŽENJE 

Ovo će također donijeti proljeće-oblak-starter-sigurnost ovisnost.

Bilo koju društvenu stranicu možemo konfigurirati kao Auth poslužitelj za našu web lokaciju ili možemo koristiti svoj vlastiti poslužitelj. U našem smo slučaju odabrali potonju opciju i konfigurirali aplikaciju koja djeluje kao Autorizacijski poslužitelj - koja se lokalno raspoređuje na // localhost: 7070 / authserver.

Naš autorizacijski poslužitelj koristi JWT tokene.

Uz to, da bi bilo koji klijent mogao dohvatiti vjerodajnice korisnika, moramo konfigurirati naš Resursni poslužitelj koji radi na portu 9000, s krajnjom točkom koja može služiti tim vjerodajnicama.

Ovdje smo konfigurirali /korisnik krajnja točka koja je dostupna na // localhost: 9000 / korisnik.

Za više detalja o tome kako postaviti poslužitelj za autorizaciju i poslužitelj resursa, ovdje pogledajte naš prethodni članak.

Sada možemo dodati bilješku u klasi konfiguracije u našoj klijentskoj aplikaciji:

@Configuration @ EnableOAuth2Sso javne klase SiteSecurityConfigurer proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (HttpSecurity http) baca izuzetak {// ...}}

Svi zahtjevi koji zahtijevaju provjeru autentičnosti bit će preusmjereni na Autorizacijski poslužitelj. Da bi ovo uspjelo, također moramo definirati svojstva poslužitelja:

sigurnost: oauth2: klijent: accessTokenUri: // localhost: 7070 / authserver / oauth / token userAuthorizationUri: // localhost: 7070 / authserver / oauth / ovlasti clientId: authserver clientSecret: passwordforauthserver resurs: userInfoUri: // localhost: 9000 / user

Imajte na umu da moramo imati spring-boot-starter-sigurnost u našem putu do razreda kako bismo pronašli kako gornja konfiguracija funkcionira.

3. Prenos pristupnih tokena

Tijekom prenošenja tokena, OAuth2 klijent prosljeđuje OAuth2 token koji je primio na odlazni zahtjev za resursom.

Otkad smo proglasili @ EnableOauth2Sso napomena, Spring Boot dodaje OAuth2ClientContext grah u opsegu zahtjeva. Na temelju toga možemo stvoriti svoje OAuth2RestTemplate u našoj klijentskoj aplikaciji:

@Bean public OAuth2RestOperations restOperations (resurs OAuth2ProtectedResourceDetails, OAuth2ClientContext context) {return new OAuth2RestTemplate (resource, context); }

Nakon što smo konfigurirali grah, kontekst će proslijediti pristupni token traženim uslugama i također će osvježiti token ako istječe.

4. Prenošenje OAuth tokena pomoću RestTemplate

Prethodno smo definirali a restOperations grah tipa OAuth2RestTemplate u našoj klijentskoj aplikaciji. Kao rezultat, možemo koristiti getForObject () metoda OAuth2RestTemplate poslati zahtjev s potrebnim tokenima na zaštićeni poslužitelj resursa od našeg klijenta.

Prvo definirajmo krajnju točku koja zahtijeva provjeru autentičnosti na našem poslužitelju resursa:

@GetMapping ("/ person") @PreAuthorize ("hasAnyRole ('ADMIN', 'USER')") public @ResponseBody Person personInfo () {return new Person ("abir", "Dhaka", "Bangladesh", 29, "Muški"); } 

Ovo je jednostavna REST krajnja točka koja vraća JSON prikaz a Osoba objekt.

Sada, možemo poslati zahtjev iz klijentske aplikacije pomoću getForObject () metoda koja će proslijediti token na Resource Server:

@Autowired private RestOperations restOperations; @GetMapping ("/ personInfo") public ModelAndView person () {ModelAndView mav = new ModelAndView ("personinfo"); Niz personResourceUrl = "// localhost: 9000 / osoba"; mav.addObject ("osoba", restOperations.getForObject (personResourceUrl, String.class)); povratak mav; }

5. Konfiguriranje Zuula za Token Relay

Ako želimo proslijediti token nizvodno na proxy usluge, možemo koristiti ugrađeni obrnuti proxy Spring Cloud Zuul.

Prvo, moramo dodati ovisnost Mavena za rad sa Zuulom:

 org.springframework.cloud proljeće-oblak-starter-netflix-zuul 

Dalje, moramo dodati znak @EnableZuulProxy napomena o našoj klasi konfiguracije u klijentskoj aplikaciji:

@Configuration @ EnableOAuth2Sso @EnableZuulProxy javna klasa SiteSecurityConfigurer proširuje WebSecurityConfigurerAdapter {// ...}

Preostalo je samo dodati svojstva konfiguracije Zuul u naš primjena.iml datoteka:

zuul: sensitiveHeaders: Cookie, Set-Cookie routes: resource: path: / api / ** url: // localhost: 9000 user: path: / user / ** url: // localhost: 9000 / user

Bilo koji zahtjev koji dolazi na /api krajnja točka klijentske aplikacije bit će preusmjerena na URL poslužitelja resursa. Također moramo navesti URL krajnje točke korisničkih vjerodajnica.

6. Zaključak

U ovom smo kratkom članku istražili kako koristiti Spring Cloud Security s OAuth2 i Zuul za konfiguriranje sigurnih poslužitelja za autorizaciju i resurse, kao i kako prenijeti OAuth2 tokene između poslužitelja koji koriste Oauth2RestTemplate i ugrađeni Zuul proxy.

Kao i uvijek, kôd je dostupan na GitHub-u.