Sprievodca jarným zasadnutím

ODPOČINOK Najlepšie

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Prehľad

Jarné zasadnutie má jednoduchý cieľ uvoľniť správu relácií z obmedzení relácie HTTP uložených na serveri.

Toto riešenie uľahčuje zdieľanie údajov relácie medzi službami v cloude bez toho, aby boli viazané na jeden kontajner (t. J. Tomcat). Ďalej podporuje viac relácií v rovnakom prehliadači a odosielanie relácií v hlavičke.

V tomto článku použijeme Jarné zasadnutie na správu autentifikačných informácií vo webovej aplikácii. Zatiaľ čo Jarné zasadnutie môže pretrvávať dáta pomocou JDBC, Gemfire alebo MongoDB, použijeme Redis.

Na úvod do Redis pozrite sa na tento článok.

2. Jednoduchý projekt

Najprv si vytvorme jednoduchý Jarná topánka neskôr použiť ako základ pre naše príklady relácií:

 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 štartovacieho testu 

Naša aplikácia beží s Jarná topánka a nadradená pomôcka poskytuje verzie pre každú položku. Najnovšiu verziu každej závislosti nájdete tu: Spring-Boot-Starter-Security, Spring-Boot-Starter-Web, Spring-Boot-Starter-Test.

Pridajme tiež niektoré konfiguračné vlastnosti pre náš server Redis v application.properties:

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

3. Konfigurácia Spring Boot

Pre jarnú topánku, stačí pridať nasledujúce závislostia o ostatné sa postará automatická konfigurácia:

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

Používame bootovacieho rodiča pom tu nastaviť verzie, takže zaručene bude fungovať s našimi ďalšími závislosťami. Najnovšiu verziu každej závislosti nájdete tu: spring-boot-starter-data-redis, spring-session.

4. Štandardná jarná konfigurácia (bez zavedenia)

Poďme sa tiež pozrieť na integráciu a konfiguráciu jarné zasadnutie bez Spring Boot - len s obyčajnou Spring.

4.1. Závislosti

Najprv, ak pridávame jarné zasadnutie k štandardnému jarnému projektu, budeme musieť výslovne definovať:

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

Najnovšie verzie týchto modulov nájdete tu: spring-session, spring-data-redis.

4.2. Konfigurácia jarných relácií

Teraz pridajme konfiguračnú triedu pre Jarné zasadnutie:

@Configuration @EnableRedisHttpSession verejná trieda SessionConfig rozširuje AbstractHttpSessionApplicationInitializer {@Bean public JedisConnectionFactory connectionFactory () {return new JedisConnectionFactory (); }}

@EnableRedisHttpSession a rozšírenie AbstractHttpSessionApplicationInitializer vytvorí a prepojí filter pred celou našou bezpečnostnou infraštruktúrou, aby vyhľadal aktívne relácie a vyplnil kontext zabezpečenia z hodnôt uložených v Redis.

Poďme teraz túto aplikáciu doplniť o radič a konfiguráciu zabezpečenia.

5. Konfigurácia aplikácie

Prejdite do nášho hlavného súboru aplikácie a pridajte ovládač:

@RestController verejná trieda SessionController {@RequestMapping ("/") public String helloAdmin () {return "ahoj admin"; }}

Získate tým koncový bod na testovanie.

Ďalej pridajte našu triedu konfigurácie zabezpečenia:

@Configuration @EnableWebSecurity verejná trieda SecurityConfig rozširuje WebSecurityConfigurerAdapter {@Autowired public void configureGlobal (AuthenticationManagerBuilder auth) hodí výnimku {auth .inMemoryAuthentication () .withUser ("admin") .password (passwordEncoder (). "" („SPRÁVCA“); } @Override protected void configure (HttpSecurity http) vyvolá výnimku {http .httpBasic (). A () .authorizeRequests () .antMatchers ("/"). HasRole ("ADMIN") .anyRequest (). Autentizovaný (); } @Bean public PasswordEncoder passwordEncoder () {vrátiť nový BCryptPasswordEncoder (); }}

Toto chráni naše koncové body pomocou základnej autentifikácie a nastavuje používateľa, s ktorým sa dá testovať.

6. Test

Nakoniec všetko otestujme - tu si zadefinujeme jednoduchý test, ktorý nám umožní vykonať dve veci:

  • konzumovať živú webovú aplikáciu
  • porozprávaj sa s Redisom

Poďme si najskôr pripraviť veci:

public class SessionControllerTest {private Jedis jedis; private TestRestTemplate testRestTemplate; private TestRestTemplate testRestTemplateWithAuth; private String testUrl = "// localhost: 8080 /"; @Before public void clearRedisData () {testRestTemplate = nový TestRestTemplate (); testRestTemplateWithAuth = nový TestRestTemplate ("admin", "heslo", null); jedis = nový Jedis ("localhost", 6379); jedis.flushAll (); }}

Všimnite si, ako nastavujeme oboch týchto klientov - klienta HTTP a Redis. Samozrejme, v tomto okamihu by mal byť server (a Redis) funkčný - aby sme s nimi mohli komunikovať prostredníctvom týchto testov.

Začnime tým, že to otestujeme Redis je prázdny:

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

Teraz otestujte, či naša bezpečnosť vracia 401 za neautentizované požiadavky:

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

Ďalej to otestujeme Jarné zasadnutie spravuje náš overovací token:

@Test public void testRedisControlsSession () {ResponseEntity result = testRestTemplateWithAuth.getForEntity (testUrl, String.class); assertEquals ("ahoj admin", result.getBody ()); // prihlásenie fungovalo Set redisResult = jedis.keys ("*"); assertTrue (redisResult.size ()> 0); // redis je vyplnený údajmi o relácii String sessionCookie = result.getHeaders (). get ("Set-Cookie"). get (0) .split (";") [0]; Hlavičky HttpHeaders = nové HttpHeaders (); headers.add ("Cookie", sessionCookie); HttpEntity httpEntity = nový HttpEntity (hlavičky); výsledok = testRestTemplate.exchange (testUrl, HttpMethod.GET, httpEntity, String.class); assertEquals ("ahoj admin", result.getBody ()); // prístup s prácami relácie fungoval jedis.flushAll (); // vymaže všetky kľúče v redis result = testRestTemplate.exchange (testUrl, HttpMethod.GET, httpEntity, String.class); assertEquals (HttpStatus.UNAUTHORIZED, result.getStatusCode ()); // prístup odmietnutý po odstránení relácií v redis}

Náš test najskôr potvrdí, že naša požiadavka bola úspešná pomocou overovacích poverení správcu.

Potom extrahujeme hodnotu relácie z hlavičiek odpovedí a použijeme ju ako našu autentizáciu v našej druhej žiadosti. Overíme to a potom vymažeme všetky údaje v Redis.

Nakoniec urobíme ďalšiu požiadavku pomocou cookie relácie a potvrdíme, že sme odhlásení. To to potvrdzuje Jarné zasadnutie riadi naše stretnutia.

7. Záver

Jarné zasadnutie je mocný nástroj na správu relácií HTTP. Keďže je naše úložisko relácií zjednodušené na konfiguračnú triedu a niekoľko závislostí Maven, môžeme teraz zapojiť viac aplikácií do jednej Redis inštanciu a zdieľať autentifikačné informácie.

Ako vždy sú všetky príklady k dispozícii na Githube.

REST spodok

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ