Een inleiding tot Spring Cloud Security

1. Overzicht

De Spring Cloud Security-module biedt functies met betrekking tot op tokens gebaseerde beveiliging in Spring Boot-applicaties.

Het maakt in het bijzonder OAuth2-gebaseerde SSO eenvoudiger - met ondersteuning voor het doorgeven van tokens tussen Resource Servers, evenals het configureren van downstream-authenticatie met behulp van een ingebouwde Zuul-proxy.

In dit korte artikel zullen we bekijken hoe we deze functies kunnen configureren met behulp van een Spring Boot-clienttoepassing, een autorisatieserver en een REST API die als een resource-server werken.

Merk op dat we voor dit voorbeeld slechts één clienttoepassing hebben die SSO gebruikt om de cloudbeveiligingsfuncties te demonstreren, maar in een typisch scenario zouden we ten minste twee clienttoepassingen hebben om de noodzaak van eenmalige aanmelding te rechtvaardigen.

2. Start snel een Cloud Security-app

Laten we beginnen SSO configureren in een Spring Boot-toepassing.

Eerst moeten we de spring-cloud-starter-oauth2 afhankelijkheid:

 org.springframework.cloud spring-cloud-starter-oauth2 2.2.2.RELEASE 

Dit zal ook de spring-cloud-starter-security afhankelijkheid.

We kunnen elke sociale site configureren als een Auth-server voor onze site of we kunnen onze eigen server gebruiken. In ons geval hebben we voor de laatste optie gekozen en een applicatie geconfigureerd die fungeert als een autorisatieserver - die lokaal wordt geïmplementeerd op // localhost: 7070 / authserver.

Onze autorisatieserver gebruikt JWT-tokens.

Bovendien moeten we onze Resource Server, die op poort 9000 draait, configureren met een eindpunt dat deze inloggegevens kan gebruiken, wil elke klant de inloggegevens van een gebruiker kunnen achterhalen.

Hier hebben we een /gebruiker eindpunt dat beschikbaar is op // localhost: 9000 / gebruiker.

Bekijk ons ​​vorige artikel hier voor meer informatie over het opzetten van een autorisatieserver en een bronserver.

We kunnen nu de annotatie toevoegen in een configuratieklasse in onze Client-applicatie:

@Configuration @ EnableOAuth2Sso public class SiteSecurityConfigurer breidt WebSecurityConfigurerAdapter uit {@Override protected void configure (HttpSecurity http) gooit uitzondering {// ...}}

Alle verzoeken die authenticatie vereisen, worden doorgestuurd naar de autorisatieserver. Om dit te laten werken, moeten we ook de servereigenschappen definiëren:

security: oauth2: client: accessTokenUri: // localhost: 7070 / authserver / oauth / token userAuthorizationUri: // localhost: 7070 / authserver / oauth / autorize clientId: authserver clientSecret: wachtwoordvooruthserver bron: userInfoUri: // localhost: 9000 / gebruiker

Merk op dat we moeten hebben spring-boot-starter-security in ons classpath om de bovenstaande configuratie te zien werken.

3. Toegangstokens doorsturen

Tijdens het doorgeven van een token, stuurt een OAuth2-client het door hem ontvangen OAuth2-token door naar een uitgaand resourceverzoek.

Omdat we de @ EnableOauth2Sso annotatie voegt Spring Boot een OAuth2ClientContext bean in het aanvraagbereik. Op basis hiervan kunnen we onze eigen creëren OAuth2RestTemplate in onze klantentoepassing:

@Bean openbare OAuth2RestOperations restOperations (OAuth2ProtectedResourceDetails-bron, OAuth2ClientContext-context) {retourneer nieuwe OAuth2RestTemplate (bron, context); }

Zodra we de boon hebben geconfigureerd, de context stuurt het toegangstoken door naar de gevraagde services en vernieuwt ook het token als het verloopt.

4. Een OAuth-token doorgeven met behulp van de RestTemplate

We hebben eerder een restOperations boon van het type OAuth2RestTemplate in onze Client-applicatie. Als resultaat, we kunnen de getForObject () methode van OAuth2RestTemplate om een ​​verzoek met de benodigde tokens naar een beschermde Resource-server te sturen van onze klant.

Laten we eerst een eindpunt definiëren dat authenticatie vereist in onze Resource Server:

@GetMapping ("/ person") @PreAuthorize ("hasAnyRole ('ADMIN', 'USER')") openbaar @ResponseBody Persoon personInfo () {return new Person ("abir", "Dhaka", "Bangladesh", 29, "Mannetje"); } 

Dit is een eenvoudig REST-eindpunt dat een JSON-weergave van een Persoon voorwerp.

Nu, we kunnen een verzoek verzenden vanuit de Client-applicatie met behulp van de getForObject () methode die het token doorgeeft aan de Resource Server:

@Autowired privé RestOperations restOperations; @GetMapping ("/ personInfo") openbaar ModelAndView person () {ModelAndView mav = nieuw ModelAndView ("personinfo"); String personResourceUrl = "// localhost: 9000 / persoon"; mav.addObject ("person", restOperations.getForObject (personResourceUrl, String.class)); terugkeer mav; }

5. Zuul configureren voor Token Relay

Als we een token stroomafwaarts naar de proxyservices willen doorgeven, kunnen we Spring Cloud Zuul Embedded Reverse Proxy gebruiken.

Eerst moeten we de Maven-afhankelijkheid toevoegen om met Zuul te werken:

 org.springframework.cloud spring-cloud-starter-netflix-zuul 

Vervolgens moeten we de @ toevoegenEnableZuulProxy annotatie op onze configuratieklasse in de Client-applicatie:

@Configuration @ EnableOAuth2Sso @EnableZuulProxy openbare klasse SiteSecurityConfigurer breidt WebSecurityConfigurerAdapter uit {// ...}

Het enige dat u hoeft te doen, is de Zuul-configuratie-eigenschappen toevoegen aan ons application.yml het dossier:

zuul: sensitiveHeaders: Cookie, Set-Cookie routes: resource: pad: / api / ** url: // localhost: 9000 gebruiker: pad: / gebruiker / ** url: // localhost: 9000 / gebruiker

Elk verzoek dat naar de /api eindpunt van de clienttoepassing wordt omgeleid naar de Resource Server-URL. We moeten ook de URL van het eindpunt van de gebruikersreferenties opgeven.

6. Conclusie

In dit korte artikel hebben we onderzocht hoe u Spring Cloud Security met OAuth2 en Zuul kunt gebruiken om beveiligde autorisatie- en resourceservers te configureren, en hoe u OAuth2-tokens tussen servers kunt doorgeven met Oauth2RestTemplate en Embedded Zuul Proxy.

Zoals altijd is de code beschikbaar op GitHub.