Gids voor Spring Session

REST Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Overzicht

Lentesessie heeft het simpele doel om sessiebeheer vrij te maken van de beperkingen van de HTTP-sessie die op de server is opgeslagen.

De oplossing maakt het gemakkelijk om sessiegegevens te delen tussen services in de cloud zonder gebonden te zijn aan een enkele container (bijvoorbeeld Tomcat). Bovendien ondersteunt het meerdere sessies in dezelfde browser en het verzenden van sessies in een koptekst.

In dit artikel gebruiken we Lentesessie om authenticatiegegevens in een webapp te beheren. Terwijl Lentesessie gegevens kunnen bewaren met behulp van JDBC, Gemfire of MongoDB, zullen we gebruiken Redis.

Voor een kennismaking met Redis bekijk dit artikel.

2. Een eenvoudig project

Laten we eerst een eenvoudig maken Spring Boot project om later als basis te gebruiken voor onze sessievoorbeelden:

 org.springframework.boot spring-boot-starter-parent 2.2.6.RELEASE org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot- startertest-test 

Onze applicatie draait met Spring Boot en de bovenliggende pom biedt versies voor elk item. De laatste versie van elke afhankelijkheid is hier te vinden: spring-boot-starter-security, spring-boot-starter-web, spring-boot-starter-test.

Laten we ook enkele configuratie-eigenschappen voor onze Redis-server toevoegen in application.properties:

spring.redis.host = localhost spring.redis.port = 6379

3. Spring Boot-configuratie

Voor Spring Boot, het is voldoende om de volgende afhankelijkheden toe te voegen, en de automatische configuratie zorgt voor de rest:

 org.springframework.boot spring-boot-starter-data-redis org.springframework.session spring-sessie-data-redis 

We gebruiken de opstartouder pom om de versies hier in te stellen, zodat deze gegarandeerd werken met onze andere afhankelijkheden. De laatste versie van elke afhankelijkheid is hier te vinden: spring-boot-starter-data-redis, spring-session.

4. Standaard veerconfiguratie (geen opstart)

Laten we ook eens kijken naar het integreren en configureren lente-sessie zonder Spring Boot - alleen met gewone Spring.

4.1. Afhankelijkheden

Ten eerste, als we toevoegen lente-sessie voor een standaard Spring-project, moeten we expliciet definiëren:

 org.springframework.session spring-session 1.2.2.RELEASE org.springframework.data spring-data-redis 1.5.0.RELEASE 

De laatste versies van deze modules zijn hier te vinden: spring-session, spring-data-redis.

4.2. Spring Session Configuratie

Laten we nu een configuratieklasse toevoegen voor Lentesessie:

@Configuration @EnableRedisHttpSession openbare klasse SessionConfig breidt AbstractHttpSessionApplicationInitializer uit {@Bean openbaar JedisConnectionFactory connectionFactory () {retourneer nieuwe JedisConnectionFactory (); }}

@EnableRedisHttpSession en de extensie van AbstractHttpSessionApplicationInitializer zal een filter maken en aansluiten voor al onze beveiligingsinfrastructuur om actieve sessies te zoeken en de beveiligingscontext te vullen met waarden die zijn opgeslagen Redis.

Laten we deze applicatie nu voltooien met een controller en de beveiligingsconfiguratie.

5. Applicatieconfiguratie

Navigeer naar ons hoofdtoepassingsbestand en voeg een controller toe:

@RestController openbare klasse SessionController {@RequestMapping ("/") openbare String helloAdmin () {retourneer "hallo admin"; }}

Dit geeft ons een eindpunt om te testen.

Voeg vervolgens onze beveiligingsconfiguratieklasse toe:

@Configuration @EnableWebSecurity public class SecurityConfig breidt WebSecurityConfigurerAdapter uit {@Autowired public void configureGlobal (AuthenticationManagerBuilder auth) gooit Uitzondering {auth .inMemoryAuthentication () .withUser ("admin") .password (passwordEncroles "wachtwoord). ("BEHEERDER"); } @Override protected void configure (HttpSecurity http) genereert uitzondering {http .httpBasic (). En () .authorizeRequests () .antMatchers ("/"). HasRole ("ADMIN") .anyRequest (). Geverifieerd (); } @Bean public PasswordEncoder passwordEncoder () {retourneer nieuwe BCryptPasswordEncoder (); }}

Dit beschermt onze endpoints met basisverificatie en stelt een gebruiker in om mee te testen.

6. Test

Laten we tot slot alles testen - we zullen hier een eenvoudige test definiëren waarmee we twee dingen kunnen doen:

  • consumeer de live webapplicatie
  • praat met Redis

Laten we eerst dingen opzetten:

openbare klasse SessionControllerTest {privé Jedis jedis; privé TestRestTemplate testRestTemplate; privé TestRestTemplate testRestTemplateWithAuth; private String testUrl = "// localhost: 8080 /"; @Before public void clearRedisData () {testRestTemplate = new TestRestTemplate (); testRestTemplateWithAuth = new TestRestTemplate ("admin", "wachtwoord", null); jedis = nieuwe Jedis ("localhost", 6379); jedis.flushAll (); }}

Merk op hoe we beide clients instellen: de HTTP-client en de Redis-client. Op dit punt zou de server (en Redis) natuurlijk actief moeten zijn, zodat we via deze tests met hen kunnen communiceren.

Laten we beginnen met dat te testen Redis is leeg:

@Test openbare ongeldige testRedisIsEmpty () {Stel resultaat = jedis.keys ("*"); assertEquals (0, result.size ()); }

Test nu of onze beveiliging een 401 retourneert voor niet-geverifieerde verzoeken:

@Test openbare ongeldige testUnauthenticatedCantAccess () {ResponseEntity resultaat = testRestTemplate.getForEntity (testUrl, String.class); assertEquals (HttpStatus.UNAUTHORIZED, result.getStatusCode ()); }

Vervolgens testen we dat Lentesessie beheert ons authenticatietoken:

@Test openbare ongeldige testRedisControlsSession () {ResponseEntity resultaat = testRestTemplateWithAuth.getForEntity (testUrl, String.class); assertEquals ("hallo admin", result.getBody ()); // login werkte Set redisResult = jedis.keys ("*"); assertTrue (redisResult.size ()> 0); // redis wordt gevuld met sessiegegevens String sessionCookie = result.getHeaders (). get ("Set-Cookie"). get (0) .split (";") [0]; HttpHeaders headers = nieuwe HttpHeaders (); headers.add ("Cookie", sessionCookie); HttpEntity httpEntity = nieuwe HttpEntity (headers); result = testRestTemplate.exchange (testUrl, HttpMethod.GET, httpEntity, String.class); assertEquals ("hallo admin", result.getBody ()); // toegang met sessiewerken werkte jedis.flushAll (); // wis alle sleutels in redis resultaat = testRestTemplate.exchange (testUrl, HttpMethod.GET, httpEntity, String.class); assertEquals (HttpStatus.UNAUTHORIZED, result.getStatusCode ()); // toegang geweigerd nadat sessies zijn verwijderd in redis}

Ten eerste bevestigt onze test dat ons verzoek succesvol was met behulp van de beheerdersverificatiegegevens.

Vervolgens extraheren we de sessiewaarde uit de antwoordheaders en gebruiken deze als onze authenticatie in ons tweede verzoek. We valideren dat en wissen vervolgens alle gegevens in Redis.

Ten slotte doen we nog een verzoek met behulp van de sessiecookie en bevestigen we dat we zijn uitgelogd. Dit bevestigt dat Lentesessie beheert onze sessies.

7. Conclusie

Lentesessie is een krachtig hulpmiddel voor het beheren van HTTP-sessies. Met onze sessieopslag vereenvoudigd tot een configuratieklasse en een paar Maven-afhankelijkheden, kunnen we nu meerdere applicaties op dezelfde Redis instantie en deel authenticatie-informatie.

Zoals altijd zijn alle voorbeelden beschikbaar op Github.

REST onder

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS