Jarná bezpečnosť - @PreFilter a @PostFilter

1. Prehľad

V tomto článku sa dozvieme, ako používať @PreFilter a @PostFilter anotácie na zabezpečenie operácií v jarnej aplikácii.

Ak sa používajú spolu s autentifikovanými hlavnými informáciami, @PreFilter a @PostFilter umožňuje nám definovať jemné bezpečnostné pravidlá pomocou jazyka Spring Expression Language.

2. Predstavujeme @PreFilter a @PostFilter

Jednoducho povedané @PreFilter a @PostFilter anotácie sú slúži na filtrovanie zoznamov objektov na základe vlastných bezpečnostných pravidiel, ktoré definujeme.

@PostFilter definuje pravidlo pre filtrovanie návratového zoznamu metódy pomocou uplatnenie tohto pravidla na každý prvok v zozname. Ak je vyhodnotená hodnota pravdivá, položka sa zachová v zozname. V opačnom prípade bude položka odstránená.

@PreFilter funguje veľmi podobným spôsobom, filtrovanie sa však aplikuje na zoznam, ktorý sa odovzdáva ako vstupný parameter do anotovanej metódy.

Obidve anotácie je možné použiť na metódy alebo typy (triedy a rozhrania). V tomto článku ich použijeme iba na metódy.

Anotácie téz nie sú predvolene aktívne - budeme ich musieť povoliť pomocou @EnableGlobalMethodSecurity anotácia a prePostEnabled = true - v našej konfigurácii zabezpečenia:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity (prePostEnabled = true) verejná trieda WebSecurityConfig rozširuje WebSecurityConfigurerAdapter {// ...}

3. Písanie bezpečnostných pravidiel

Na napísanie bezpečnostných pravidiel do týchto dvoch anotácií použijeme výrazy Spring-EL; môžeme použiť aj vstavaný objekt filterObject získať odkaz na konkrétny testovaný prvok zoznamu.

Spring Security poskytuje mnoho ďalších vstavaných objektov na vytvorenie veľmi konkrétnych a presných pravidiel.

Napríklad, môžeme použiť @PreFilter skontrolovať, či postupca majetok a Úloha objekt sa rovná názov aktuálne overeného používateľa:

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

Použili sme @PostFilter anotácia, pretože chceme, aby metóda vykonala a získala všetky úlohy ako prvé, a každú našu úlohu zo zoznamu odovzdajú cez naše pravidlo filtra.

Ak je teda overeným používateľom michael, konečný zoznam úloh vrátených findAll Táto metóda by obsahovala iba úlohy, ktoré sú im pridelené michael, aj keď má databáza priradené úlohy jim a pam.

Teraz urobme pravidlo o niečo zaujímavejšie. Predpokladajme, že ak je používateľ správcom, môže vidieť všetky úlohy bez ohľadu na to, ku komu sú priradené:

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

Použili sme zabudovanú metódu hasRole skontrolovať, či má autentifikovaný užívateľ rolu MANAGER. Ak hasRole vráti true, úloha bude uchovaná v konečnom zozname. Ak je teda používateľom správca, pravidlo vráti hodnotu true pre každú položku v zozname. Konečný zoznam teda bude obsahovať všetky položky.

Teraz poďme filtrovať zoznam odovzdaný ako parameter a uložiť metóda pomocou @PreFilter:

@PreFilter ("hasRole ('MANAGER') alebo filterObject.assignee == authentication.name") Iterovateľné uloženie (Iterovateľné entity) {// ...}

Pravidlo zabezpečenia je rovnaké ako pravidlo, ktoré sme použili na serveri @PostFilter príklad. Hlavný rozdiel tu spočíva v tom, že položky zoznamu budú filtrované pred vykonaním metódy, čo nám umožní odstrániť niektoré položky zo zoznamu a zabrániť ich tak v uložení do databázy.

Takže jim, ktorý nie je manažérom, sa môže pokúsiť uložiť zoznam úloh, ku ktorým sú niektoré priradené pam. Avšak iba tie úlohy, ktoré sú pridelené jim budú zahrnuté, ostatné budú ignorované.

4. Výkon na veľkých zoznamoch

@PreFilter je skutočne v pohode a ľahko sa používa, ale môže to byť neefektívne pri práci s veľmi veľkými zoznamami, pretože operácia načítania načíta všetky údaje a použije filter neskôr.

Predstavte si napríklad, že máme v našej databáze tisíce úloh a chceme načítať päť úloh, ktoré sú momentálne priradené pam. Ak použijeme @PreFilter, operácia s databázou najskôr načíta všetky úlohy a cez všetky z nich bude filtrovať tie, ktoré nie sú priradené pam.

5. Záver

Tento rýchly článok vysvetlil, ako vytvoriť jednoduchú, ale bezpečnú aplikáciu pomocou Spring Security @PreFilter a @PostFilter anotácie.

Skontrolujte úplný príklad kódu v tomto úložisku Github.


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