Vejledning til forårssession

REST Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Oversigt

Forårsession har det enkle mål at frigøre sessionadministration fra begrænsningerne i HTTP-sessionen, der er gemt på serveren.

Løsningen gør det let at dele sessionsdata mellem tjenester i skyen uden at være bundet til en enkelt container (dvs. Tomcat). Derudover understøtter det flere sessioner i samme browser og afsendelse af sessioner i en overskrift.

I denne artikel bruger vi Forårsession til at administrere godkendelsesoplysninger i en webapp. Mens Forårsession kan vedvare data ved hjælp af JDBC, Gemfire eller MongoDB, vil vi bruge Redis.

For en introduktion til Redis tjek denne artikel.

2. Et simpelt projekt

Lad os først oprette en simpel Spring Boot projekt, der skal bruges som base for vores sessionseksempler senere:

 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- start-test test 

Vores ansøgning kører med Spring Boot og den overordnede pom giver versioner til hver post. Den nyeste version af hver afhængighed kan findes her: spring-boot-starter-sikkerhed, spring-boot-starter-web, spring-boot-starter-test.

Lad os også tilføje nogle konfigurationsegenskaber til vores Redis-server i application.properties:

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

3. Spring Boot Configuration

Til Spring Boot, det er nok at tilføje følgende afhængigheder, og den automatiske konfiguration tager sig af resten:

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

Vi bruger opstartsforældren pom for at indstille versionerne her, så disse fungerer garanteret med vores andre afhængigheder. Den seneste version af hver afhængighed kan findes her: spring-boot-starter-data-redis, spring-session.

4. Standard Spring Config (ingen boot)

Lad os også se på integrationen og konfigurationen forårssession uden fjederstøvle - bare med almindelig fjeder.

4.1. Afhængigheder

Først hvis vi tilføjer forårssession til et standard forårsprojekt skal vi udtrykkeligt definere:

 org.springframework.session forårssession 1.2.2.RELEASE org.springframework.data spring-data-redis 1.5.0.RELEASE 

De nyeste versioner af disse moduler kan findes her: spring-session, spring-data-redis.

4.2. Konfiguration af forårssession

Lad os nu tilføje en konfigurationsklasse til Forårsession:

@Configuration @EnableRedisHttpSession offentlig klasse SessionConfig udvider AbstractHttpSessionApplicationInitializer {@Bean public JedisConnectionFactory connectionFactory () {returner ny JedisConnectionFactory (); }}

@EnableRedisHttpSession og udvidelsen af AbstractHttpSessionApplicationInitializer vil oprette og oprette et filter foran al vores sikkerhedsinfrastruktur for at lede efter aktive sessioner og udfylde sikkerhedskonteksten fra værdier, der er gemt i Redis.

Lad os nu udfylde denne applikation med en controller og sikkerhedskonfigurationen.

5. Konfiguration af applikation

Naviger til vores hovedapplikationsfil og tilføj en controller:

@RestController offentlig klasse SessionController {@RequestMapping ("/") offentlig String helloAdmin () {returner "hej admin"; }}

Dette giver os et slutpunkt at teste.

Dernæst tilføj vores sikkerhedskonfigurationsklasse:

@Configuration @EnableWebSecurity public class SecurityConfig udvider WebSecurityConfigurerAdapter {@Autowired public void configureGlobal (AuthenticationManagerBuilder auth) kaster undtagelse {auth .inMemoryAuthentication () .withUser ("admin") .password (passwordEncoder.). ("ADMIN"); } @ Override beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {http. HttpBasic (). Og (). Autorisationsanmodninger (). AntMatchers ("/"). HasRole ("ADMIN") .anyRequest (). Godkendt (); } @Bean public PasswordEncoder passwordEncoder () {returner ny BCryptPasswordEncoder (); }}

Dette beskytter vores slutpunkter med grundlæggende godkendelse og indstiller en bruger til at teste med.

6. Test

Lad os endelig teste alt - vi definerer en simpel test her, der giver os mulighed for at gøre to ting:

  • forbruge den live webapplikation
  • tale med Redis

Lad os først opsætte tingene:

offentlig klasse SessionControllerTest {private Jedis jedis; privat TestRestTemplate testRestTemplate; privat TestRestTemplate testRestTemplateWithAuth; privat streng testUrl = "// localhost: 8080 /"; @Før offentlig tomrum clearRedisData () {testRestTemplate = ny TestRestTemplate (); testRestTemplateWithAuth = ny TestRestTemplate ("admin", "password", null); jedis = nye Jedis ("localhost", 6379); jedis.flushAll (); }}

Bemærk hvordan vi konfigurerer begge disse klienter - HTTP-klienten og Redis-en. Selvfølgelig skal serveren (og Redis) på dette tidspunkt være i gang - så vi kan kommunikere med dem via disse tests.

Lad os begynde med at teste det Redis er tom:

@Test offentlig ugyldig testRedisIsEmpty () {Set result = jedis.keys ("*"); assertEquals (0, result.size ()); }

Test nu, at vores sikkerhed returnerer en 401 for uautoriserede anmodninger:

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

Dernæst tester vi det Forårsession administrerer vores godkendelsestoken:

@Test offentlig ugyldig testRedisControlsSession () {ResponseEntity result = testRestTemplateWithAuth.getForEntity (testUrl, String.class); assertEquals ("hej admin", result.getBody ()); // login fungerede Sæt redisResult = jedis.keys ("*"); assertTrue (redisResult.size ()> 0); // redis er befolket med sessionsdata String sessionCookie = result.getHeaders (). get ("Set-Cookie"). get (0) .split (";") [0]; HttpHeaders headers = nye HttpHeaders (); headers.add ("Cookie", sessionCookie); HttpEntity httpEntity = ny HttpEntity (overskrifter); resultat = testRestTemplate.exchange (testUrl, HttpMethod.GET, httpEntity, String.class); assertEquals ("hej admin", result.getBody ()); // adgang med sessionsværker arbejdet jedis.flushAll (); // ryd alle nøgler i redis resultat = testRestTemplate.exchange (testUrl, HttpMethod.GET, httpEntity, String.class); assertEquals (HttpStatus.UNAUTHORIZED, result.getStatusCode ()); // adgang nægtet efter at sessioner er fjernet i redis}

For det første bekræfter vores test, at vores anmodning lykkedes ved hjælp af administratorautentificeringsoplysninger.

Derefter udtrækker vi sessionsværdien fra svaroverskrifterne og bruger den som vores godkendelse i vores anden anmodning. Vi validerer det og rydder derefter alle data i Redis.

Endelig fremsætter vi endnu en anmodning ved hjælp af sessionscookien og bekræfter, at vi er logget ud. Dette bekræfter det Forårsession administrerer vores sessioner.

7. Konklusion

Forårsession er et kraftfuldt værktøj til styring af HTTP-sessioner. Med vores sessionlager forenklet til en konfigurationsklasse og et par Maven-afhængigheder, kan vi nu oprette flere applikationer til det samme Redis forekomme og dele godkendelsesoplysninger.

Som altid er alle eksemplerne tilgængelige på Github.

REST bunden

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

$config[zx-auto] not found$config[zx-overlay] not found