Veiledning til vårsesjonen

REST Topp

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Oversikt

Vårsesjon har det enkle målet å frigjøre øktadministrasjon fra begrensningene til HTTP-økten som er lagret på serveren.

Løsningen gjør det enkelt å dele sesjonsdata mellom tjenester i skyen uten å være bundet til en enkelt container (dvs. Tomcat). I tillegg støtter den flere økter i samme nettleser og sending av økter i en overskrift.

I denne artikkelen vil vi bruke Vårsesjon for å administrere autentiseringsinformasjon i en webapp. Samtidig som Vårsesjon kan vedvare data ved hjelp av JDBC, Gemfire eller MongoDB, vil vi bruke Redis.

For en introduksjon til Redis sjekk ut denne artikkelen.

2. Et enkelt prosjekt

La oss først lage en enkel Vårstøvel prosjekt som skal brukes som en base for sesjonseksemplene våre 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 

Søknaden vår kjører med Vårstøvel og foreldrepompen gir versjoner for hver oppføring. Den siste versjonen av hver avhengighet finner du her: spring-boot-starter-security, spring-boot-starter-web, spring-boot-starter-test.

La oss også legge til noen konfigurasjonsegenskaper for Redis-serveren vår i application.properties:

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

3. Spring Boot Configuration

For vårstøvel, det er nok å legge til følgende avhengigheter, og den automatiske konfigurasjonen tar seg av resten:

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

Vi bruker oppstartsforelderen pom å sette versjonene her, så disse fungerer garantert med våre andre avhengigheter. Den siste versjonen av hver avhengighet finner du her: spring-boot-starter-data-redis, spring-session.

4. Standard vårkonfig (uten støvel)

La oss også ta en titt på integrering og konfigurering vår-økt uten vårstøvel - bare med vanlig fjær.

4.1. Avhengigheter

Først hvis vi legger til vår-økt til et standard vårprosjekt, må vi definere eksplisitt:

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

De siste versjonene av disse modulene finner du her: spring-session, spring-data-redis.

4.2. Vårsesjonskonfigurasjon

La oss nå legge til en konfigurasjonsklasse for Vårsesjon:

@Configuration @EnableRedisHttpSession offentlig klasse SessionConfig utvider AbstractHttpSessionApplicationInitializer {@Bean public JedisConnectionFactory connectionFactory () {return new JedisConnectionFactory (); }}

@EnableRedisHttpSession og utvidelsen av AbstractHttpSessionApplicationInitializer vil opprette og koble et filter foran all sikkerhetsinfrastrukturen vår for å se etter aktive økter og fylle ut sikkerhetskonteksten fra verdier som er lagret i Redis.

La oss nå fullføre denne applikasjonen med en kontroller og sikkerhetskonfigurasjonen.

5. Konfigurasjon av applikasjon

Naviger til vår viktigste applikasjonsfil og legg til en kontroller:

@RestController public class SessionController {@RequestMapping ("/") public String helloAdmin () {return "hallo admin"; }}

Dette vil gi oss et sluttpunkt å teste.

Deretter legger du til vår sikkerhetskonfigurasjonsklasse:

@Configuration @EnableWebSecurity offentlig klasse SecurityConfig utvider WebSecurityConfigurerAdapter {@Autowired public void configureGlobal (AuthenticationManagerBuilder auth) kaster Unntak {auth .inMemoryAuthentication () .withUser ("admin") .password (passwordEncoder.). (PasswordEncoder.) ("ADMIN"); } @ Override beskyttet ugyldig konfigurasjon (HttpSecurity http) kaster unntak {http .httpBasic (). Og () .authorizeRequests () .antMatchers ("/"). HasRole ("ADMIN") .anyRequest (). Autentisert (); } @Bean public PasswordEncoder passwordEncoder () {return new BCryptPasswordEncoder (); }}

Dette beskytter sluttpunktene våre med grunnleggende autentisering og setter opp en bruker å teste med.

6. Test

Til slutt, la oss teste alt - vi definerer en enkel test her som vil tillate oss å gjøre to ting:

  • konsumere live web-applikasjonen
  • snakk med Redis

La oss først sette opp ting:

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

Legg merke til hvordan vi setter opp begge disse klientene - HTTP-klienten og Redis-klienten. Selvfølgelig, på dette tidspunktet skal serveren (og Redis) være i gang - slik at vi kan kommunisere med dem via disse testene.

La oss begynne med å teste det Redis er tom:

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

Test nå at sikkerheten vår returnerer en 401 for uautentiserte forespørsler:

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

Deretter tester vi det Vårsesjon administrerer godkjenningstokenet vårt:

@Test offentlig ugyldig testRedisControlsSession () {ResponseEntity result = testRestTemplateWithAuth.getForEntity (testUrl, String.class); assertEquals ("hallo admin", result.getBody ()); // innlogging fungerte Sett redisResult = jedis.keys ("*"); assertTrue (redisResult.size ()> 0); // redis er fylt med øktdata 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 ("hallo admin", result.getBody ()); // tilgang med øktarbeid jobbet jedis.flushAll (); // tøm alle nøkler i redis resultat = testRestTemplate.exchange (testUrl, HttpMethod.GET, httpEntity, String.class); assertEquals (HttpStatus.UNAUTHORIZED, result.getStatusCode ()); // tilgang nektet etter at økter er fjernet i redis}

For det første bekrefter testen vår at forespørselen vår var vellykket ved hjelp av administratorautentiseringslegitimasjonen.

Deretter trekker vi ut øktverdien fra svaroverskriftene og bruker den som vår godkjenning i den andre forespørselen vår. Vi validerer det, og tøm deretter alle dataene i Redis.

Til slutt kommer vi med en ny forespørsel ved hjelp av øktcookien og bekrefter at vi er logget av. Dette bekrefter det Vårsesjon administrerer øktene våre.

7. Konklusjon

Vårsesjon er et kraftig verktøy for å administrere HTTP-økter. Med øktlagringen vår forenklet til en konfigurasjonsklasse og noen få Maven-avhengigheter, kan vi nå koble opp flere applikasjoner til det samme Redis forekomst og del autentiseringsinformasjon.

Som alltid er alle eksemplene tilgjengelig på Github.

HVILLE bunnen

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

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