Vodič za proljetno zasjedanje

OSTALO Vrh

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Pregled

Proljetno zasjedanje ima jednostavan cilj osloboditi upravljanje sesijom ograničenja HTTP sesije pohranjene na poslužitelju.

Rješenje olakšava dijeljenje podataka o sesiji između usluga u oblaku bez vezivanja za jedan spremnik (tj. Tomcat). Uz to, podržava više sesija u istom pregledniku i slanje sesija u zaglavlju.

U ovom ćemo članku koristiti Proljetno zasjedanje za upravljanje podacima o autentifikaciji u web aplikaciji. Dok Proljetno zasjedanje mogu zadržati podatke koristeći JDBC, Gemfire ili MongoDB, mi ćemo ih koristiti Redis.

Za uvod u Redis pogledajte ovaj članak.

2. Jednostavan projekt

Stvorimo najprije jednostavan Proljetni čizme projekt koji ćemo kasnije koristiti kao osnovu za primjere naših sesija:

 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- test ispitivanja startera 

Naša aplikacija radi sa Proljetni čizme a roditelj pom pruža verzije za svaki unos. Najnoviju verziju svake ovisnosti možete pronaći ovdje: spring-boot-starter-security, spring-boot-starter-web, spring-boot-starter-test.

Dodamo i neka svojstva konfiguracije za naš Redis poslužitelj u primjena.svojstva:

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

3. Konfiguracija proljetnog pokretanja

Za proljetni boot, dovoljno je dodati sljedeće ovisnosti, a za ostalo će se pobrinuti automatska konfiguracija:

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

Koristimo boot roditelja pom ovdje postaviti verzije, tako da će zajamčeno raditi s našim ostalim ovisnostima. Najnoviju verziju svake ovisnosti možete pronaći ovdje: spring-boot-starter-data-redis, spring-session.

4. Standardna konfiguracija opruge (bez pokretanja)

Pogledajmo i integraciju i konfiguriranje proljetno zasjedanje bez proljetne čizme - samo s običnom oprugom.

4.1. Ovisnosti

Prvo, ako zbrajamo proljetno zasjedanje za standardni proljetni projekt morat ćemo izričito definirati:

 org.springframework.session proljetna sesija 1.2.2.OBLOŽENJE org.springframework.data spring-data-redis 1.5.0.RELEASE 

Najnovije verzije ovih modula možete pronaći ovdje: spring-session, spring-data-redis.

4.2. Konfiguracija proljetne sesije

Ajmo sada dodati klasu konfiguracije za Proljetno zasjedanje:

@Configuration @EnableRedisHttpSession javna klasa SessionConfig proširuje AbstractHttpSessionApplicationInitializer {@Bean public JedisConnectionFactory connectionFactory () {return new JedisConnectionFactory (); }}

@EnableRedisHttpSession i produženje AbstractHttpSessionApplicationInitializer stvorit će i povezati filtar ispred sve naše sigurnosne infrastrukture za traženje aktivnih sesija i popunjavanje sigurnosnog konteksta iz vrijednosti pohranjenih u Redis.

Dovršimo sada ovu aplikaciju s kontrolerom i sigurnosnom konfiguracijom.

5. Konfiguracija aplikacije

Dođite do naše glavne aplikacijske datoteke i dodajte kontroler:

@RestController javna klasa SessionController {@RequestMapping ("/") javni niz helloAdmin () {return "hello admin"; }}

To će nam dati krajnju točku za testiranje.

Zatim dodajte našu klasu sigurnosne konfiguracije:

@Configuration @EnableWebSecurity javna klasa SecurityConfig proširuje WebSecurityConfigurerAdapter {@Autowired public void configureGlobal (AuthenticationManagerBuilder auth) baca izuzetak {auth .inMemoryAuthentication () .withUser ("admin"). Lozinka ("lozinka" enc. ("UPRAVNIK"); } @Override zaštićena void konfiguracija (HttpSecurity http) baca iznimku {http .httpBasic (). I () .authorizeRequests () .antMatchers ("/"). HasRole ("ADMIN") .anyRequest (). Authenticated (); } @Bean public PasswordEncoder passwordEncoder () {return new BCryptPasswordEncoder (); }}

To štiti naše krajnje točke osnovnom provjerom autentičnosti i postavlja korisnika za testiranje.

6. Test

Na kraju, testirajmo sve - ovdje ćemo definirati jednostavan test koji će nam omogućiti da napravimo dvije stvari:

  • konzumirajte web aplikaciju uživo
  • razgovaraj s Redisom

Prvo postavimo stvari:

javna klasa SessionControllerTest {privatni jedis jedis; privatni TestRestTemplate testRestTemplate; private TestRestTemplate testRestTemplateWithAuth; privatni niz testUrl = "// localhost: 8080 /"; @Before public void clearRedisData () {testRestTemplate = novi TestRestTemplate (); testRestTemplateWithAuth = novi TestRestTemplate ("admin", "lozinka", null); jedis = novi Jedi ("localhost", 6379); jedis.flushAll (); }}

Primijetite kako postavljamo oba klijenta - HTTP i Redis. Naravno, u ovom bi trenutku poslužitelj (i Redis) trebao biti pokrenut i pokrenut - kako bismo s njima mogli komunicirati putem ovih testova.

Počnimo s testiranjem Redis prazno je:

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

Sada testirajte da li naša zaštita vraća 401 za neautentificirane zahtjeve:

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

Zatim to testiramo Proljetno zasjedanje upravlja našim tokenom za provjeru autentičnosti:

@Test public void testRedisControlsSession () {ResponseEntity rezultat = testRestTemplateWithAuth.getForEntity (testUrl, String.class); assertEquals ("pozdrav admin", result.getBody ()); // prijava je radila Postavi redisResult = jedis.keys ("*"); assertTrue (redisResult.size ()> 0); // redis se popunjava podacima o sesiji String sessionCookie = result.getHeaders (). get ("Set-Cookie"). get (0) .split (";") [0]; HttpHeaders zaglavlja = novi HttpHeaders (); headers.add ("Kolačić", sessionCookie); HttpEntity httpEntity = novi HttpEntity (zaglavlja); rezultat = testRestTemplate.exchange (testUrl, HttpMethod.GET, httpEntity, String.class); assertEquals ("pozdrav admin", result.getBody ()); // pristup s radom sesije radio jedis.flushAll (); // obriši sve ključeve u redis rezultat = testRestTemplate.exchange (testUrl, HttpMethod.GET, httpEntity, String.class); assertEquals (HttpStatus.UNAUTHORIZED, result.getStatusCode ()); // pristup odbijen nakon uklanjanja sesija u redis}

Prvo, naš test potvrđuje da je naš zahtjev bio uspješan pomoću vjerodajnica za provjeru autentičnosti administratora.

Zatim izvlačimo vrijednost sesije iz zaglavlja odgovora i koristimo je kao našu provjeru autentičnosti u našem drugom zahtjevu. To provjeravamo i zatim brišemo sve podatke Redis.

Konačno, podnosimo još jedan zahtjev pomoću kolačića sesije i potvrđujemo da smo odjavljeni. Ovo to potvrđuje Proljetno zasjedanje upravlja našim sesijama.

7. Zaključak

Proljetno zasjedanje moćan je alat za upravljanje HTTP sesijama. Uz našu pohranu sesija pojednostavljenu na konfiguracijsku klasu i nekoliko ovisnosti o Mavenu, sada možemo povezati više aplikacija u istu Redis instance i dijeliti podatke za provjeru autentičnosti.

Kao i uvijek svi primjeri su dostupni na Githubu.

OSTALO dno

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ