Proljetna sigurnost - @PreFilter i @PostFilter

1. Pregled

U ovom ćemo članku naučiti kako koristiti @PreFilter i @PostFilter napomene za osiguranje operacija u Spring aplikaciji.

Kada se koristi zajedno s ovjerenim glavnim podacima, @PreFilter i @PostFilter omogućuje nam definiranje preciznih sigurnosnih pravila pomoću Spring Expression Language.

2. Upoznavanje @PreFilter i @PostFilter

Jednostavno rečeno, @PreFilter i @PostFilter napomene su koristi se za filtriranje popisa objekata na temelju prilagođenih sigurnosnih pravila koja definiramo.

@PostFilter definira pravilo za filtriranje povratne liste metode pomoću primjenjujući to pravilo na svaki element na popisu. Ako je procijenjena vrijednost istinita, stavka će se zadržati na popisu. U suprotnom, stavka će biti uklonjena.

@PreFilter radi na vrlo sličan način, međutim, filtriranje se primjenjuje na popis koji se prosljeđuje kao ulazni parametar označenoj metodi.

Obje napomene mogu se koristiti na metodama ili vrstama (klase i sučelja). Koristit ćemo ih samo za metode u ovom članku.

Bilješke o tezama prema zadanim postavkama nisu aktivne - morat ćemo ih omogućiti pomoću @EnableGlobalMethodSecurity anotacija i prePostEnabled = true - u našoj sigurnosnoj konfiguraciji:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity (prePostEnabled = true) javna klasa WebSecurityConfig proširuje WebSecurityConfigurerAdapter {// ...}

3. Pisanje sigurnosnih pravila

Da bismo napisali sigurnosna pravila u ove dvije bilješke - poslužit ćemo se izrazima Spring-EL; možemo koristiti i ugrađeni objekt filterObject da biste dobili referencu na određeni element popisa koji se testira.

Spring Security nudi mnoge druge ugrađene objekte za stvaranje vrlo specifičnih i točnih pravila.

Na primjer, možemo koristiti @PreFilter kako bi provjerili je li opunomoćenik svojstvo a Zadatak objekt je jednak Ime trenutno ovjerenog korisnika:

@PostFilter ("filterObject.assignee == authentication.name") Popis findAll () {...}

Koristili smo @PostFilter ovdje napominjemo jer želimo da metoda izvrši i prvo dobije sve zadatke, a svaki pojedinačni zadatak s popisa prosljeđuje kroz naše pravilo filtra.

Dakle, ako je ovjereni korisnik Michael, konačni popis zadataka koje je vratio pronađi sve metoda sadržavala bi samo zadatke kojima su dodijeljeni Michael, čak i ako baza podataka ima zadatke dodijeljene jim i pam.

Sada učinimo pravilo malo zanimljivijim. Pretpostavimo da ako je korisnik upravitelj može vidjeti sve zadatke, bez obzira na to kome su dodijeljeni:

@PostFilter ("hasRole ('MANAGER') ili filterObject.assignee == authentication.name") Popis findAll () {// ...}

Koristili smo ugrađenu metodu hasRole kako bi provjerio ima li ovjereni korisnik ulogu MENADŽERA. Ako hasRole vrati true, zadatak će se zadržati na konačnom popisu. Dakle, ako je korisnik upravitelj, pravilo će vratiti vrijednost true za svaku stavku na popisu. Tako će konačni popis sadržavati sve stavke.

A sada filtrirajmo popis prosljeđen kao parametar a uštedjeti metoda pomoću @PreFilter:

@PreFilter ("hasRole ('MANAGER') ili filterObject.assignee == authentication.name") Iterable spremanje (Iterable entiteti) {// ...}

Sigurnosno pravilo je isto kao i ono koje smo koristili na @PostFilter primjer. Glavna razlika ovdje je u tome što će se stavke popisa filtrirati prije izvođenja metode, što nam omogućuje uklanjanje nekih stavki s popisa, sprječavajući njihovo spremanje u bazu podataka.

Tako jim, koji nije upravitelj, može pokušati spremiti popis zadataka od kojih su neki dodijeljeni pam. Međutim samo oni zadaci dodijeljeni jim bit će uključeni, ostali će se ignorirati.

4. Izvedba na velikim popisima

@PreFilter je stvarno cool i jednostavan za upotrebu, ali može biti neučinkovit kada se radi s vrlo velikim popisima, jer će operacija dohvaćanja dohvatiti sve podatke i nakon toga primijeniti filtar.

Zamislite, na primjer, da u našoj bazi podataka imamo tisuće zadataka i želimo dohvatiti pet zadataka koji su trenutno dodijeljeni pam. Ako koristimo @PreFilter, operacija baze podataka prvo će dohvatiti sve zadatke i pregledavati sve da bi filtrirala one koji nisu dodijeljeni pam.

5. Zaključak

Ovaj je brzi članak objasnio kako stvoriti jednostavnu, ali sigurnu aplikaciju pomoću Spring Security-a @PreFilter i @PostFilter bilješke.

Provjerite cjeloviti primjer koda u ovom Github spremištu.


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