Spring Security - zaglavlja kontrole predmemorije

1. Uvod

U ovom ćemo članku istražiti kako možemo kontrolirati HTTP predmemoriranje pomoću Spring Security.

Pokazat ćemo njegovo zadano ponašanje i objasniti obrazloženje koje stoji iza toga. Zatim ćemo razmotriti načine kako promijeniti ovo ponašanje, djelomično ili u potpunosti.

2. Zadano ponašanje u keširanju

Učinkovitom upotrebom zaglavlja upravljanja predmemorijom možemo uputiti naš preglednik da predmemorira resurse i izbjegne mrežni skok. To smanjuje kašnjenje, a također i opterećenje na našem poslužitelju.

Prema zadanim postavkama Spring Security postavlja određene vrijednosti zaglavlja kontrole predmemorije za nas, a da ništa ne moramo konfigurirati.

Prvo, postavimo Spring Security za našu aplikaciju:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity javna klasa SpringSecurityConfig proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (HttpSecurity http) baca izuzetak {}}

Nadjačavamo konfigurirati() ako ne radimo ništa, to znači da nećemo trebati biti autentificirani da bismo postigli krajnju točku, što nam omogućuje da se usredotočimo na čisto testiranje predmemoriranja.

Dalje, implementiramo jednostavnu REST krajnju točku:

@GetMapping ("/ default / users / {name}") javni ResponseEntity getUserWithDefaultCaching (@PathVariable String name) {return ResponseEntity.ok (new UserDto (name)); }

Dobivena kontrola predmemorije zaglavlje će izgledati ovako:

[kontrola predmemorije: no-cache, no-store, max-age = 0, mora se ponovno potvrditi]

Na kraju, provedimo test koji pogađa krajnju točku i utvrdimo koja su zaglavlja poslana u odgovoru:

given () .when () .get (getBaseUrl () + "/ default / users / Michael"). then () .header ("Cache-Control", "no-cache, no-store, max-age = 0 , mora ponovno potvrditi ") .header (" Pragma "," no-cache ");

U osnovi, to znači da preglednik nikada neće pohraniti ovaj odgovor.

Iako se ovo može činiti neučinkovitim, zapravo postoji dobar razlog za ovo zadano ponašanje - Ako se jedan korisnik odjavi, a drugi se prijavi, ne želimo da može vidjeti resurse prethodnih korisnika. Puno je sigurnije da ništa ne predmemorirate prema zadanim postavkama i prepustite nama da budemo odgovorni za eksplicitno omogućavanje predmemoriranja.

3. Nadjačavanje zadanog ponašanja keširanja

Ponekad bismo mogli imati posla s resursima za koje želimo da budu predmemorirani. Ako ćemo to omogućiti, to bi bilo najsigurnije učiniti po resursima. To znači da svi drugi resursi i dalje neće biti predmemorirani prema zadanim postavkama.

Da bismo to učinili, pokušajmo nadjačati zaglavlja kontrole predmemorije u jednoj metodi rukovatelja, pomoću CacheControl predmemorija. The CacheControl class je tečan graditelj, što nam olakšava stvaranje različitih vrsta predmemoriranja:

@GetMapping ("/ users / {name}") javni ResponseEntity getUser (@PathVariable String name) {return ResponseEntity.ok () .cacheControl (CacheControl.maxAge (60, TimeUnit.SECONDS)) .body (novi UserDto (ime) ); }

Hajde da pogodimo ovu krajnju točku u našem testu i ustvrdimo da smo promijenili zaglavlja:

given () .when () .get (getBaseUrl () + "/ users / Michael"). then () .header ("Cache-Control", "max-age = 60");

Kao što vidimo, nadjačali smo zadane postavke, a sada će naš odgovor preglednik predmemorirati 60 sekundi.

4. Isključivanje zadanog ponašanja keširanja

Također možemo potpuno isključiti zadana zaglavlja kontrole predmemorije Spring Securitya. Ovo je prilično rizično, a zapravo nije preporučljivo. Ali, ako to stvarno želimo, onda to možemo pokušati nadjačati konfigurirati metoda WebSecurityConfigurerAdapter:

@Override zaštićena void konfiguracija (HttpSecurity http) baca iznimku {http.headers (). Disable (); }

A sada, podnesite zahtjev našoj krajnjoj točki i pogledajte kakav ćemo odgovor dobiti:

given () .when () .get (getBaseUrl () + "/ default / users / Michael"). then () .headers (novi HashMap ());

Kao što vidimo, uopće nisu postavljena zaglavlja predmemorije. Opet, ovo nije sigurno, ali dokazuje kako možemo isključiti zadana zaglavlja ako to želimo.

5. Zaključak

Ovaj članak prikazuje kako Spring Security prema zadanim postavkama onemogućuje HTTP predmemoriranje i objašnjava da je to zato što ne želimo predmemorirati sigurne resurse. Također smo vidjeli kako možemo onemogućiti ili izmijeniti ovo ponašanje onako kako smatramo prikladnim.

Provedbu svih ovih primjera i isječaka koda možete pronaći u projektu GitHub - ovo je Maven projekt, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.