Tavaszi biztonság - @PreFilter és @PostFilter

1. Áttekintés

Ebben a cikkben megtanuljuk a @Előszűrő és @PostFilter jegyzetek a műveletek biztonságához egy Spring alkalmazásban.

Ha a hitelesített fő információkkal együtt használják, @Előszűrő és @PostFilter lehetővé teszi számunkra, hogy a Spring Expression Language segítségével részletesen meghatározzuk a biztonsági szabályokat.

2. Bemutatkozás @Előszűrő és @PostFilter

Egyszerűen fogalmazva: @Előszűrő és @PostFilter annotációk vannak objektumlisták szűrésére szolgál az általunk meghatározott egyéni biztonsági szabályok alapján.

@PostFilter meghatároz egy szabályt a módszer visszatérési listájának szűrésére alkalmazza ezt a szabályt a lista minden elemére. Ha az érték igaz, akkor az elem a listán marad. Ellenkező esetben az elem eltávolításra kerül.

@Előszűrő nagyon hasonló módon működik, azonban a szűrést egy listára alkalmazzák, amelyet bemeneti paraméterként továbbítanak az annotált módszerhez.

Mindkét jelölés használható módszerekre vagy típusokra (osztályok és interfészek). Ezeket a cikkben csak módszerekre fogjuk használni.

A tézisjegyzetek alapértelmezés szerint nem aktívak - engedélyeznünk kell őket a @EnableGlobalMethodSecurity annotáció és prePostEnabled = true - a biztonsági konfigurációnkban:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity (prePostEnabled = true) nyilvános osztály A WebSecurityConfig kiterjeszti a WebSecurityConfigurerAdapter {// ...}

3. Biztonsági szabályok írása

A biztonsági szabályok e két kommentárba írása - használjuk a Spring-EL kifejezéseket; használhatjuk a beépített objektumot is filterObject hogy hivatkozást kapjon az adott tesztelendő listaelemre.

A Spring Security számos más beépített objektumot kínál, amelyek nagyon specifikus és pontos szabályokat hoznak létre.

Például, tudjuk használni @Előszűrő hogy ellenőrizze, hogy a engedményes tulajdonsága a Feladat objektum egyenlő a név a jelenleg hitelesített felhasználó

@PostFilter ("filterObject.assignee == hitelesítés.név") List findAll () {...}

Felhasználtuk a @PostFilter annotáció itt, mivel azt akarjuk, hogy a módszer az összes feladatot hajtsa végre és kapja meg, és minden egyes feladatot átadnak a listáról a szűrőszabályunkon keresztül.

Tehát, ha a hitelesített felhasználó az michael, a. által visszaadott feladatok végleges listája Találd meg mindet metódus csak a hozzárendelt feladatokat tartalmazná michael, még akkor is, ha az adatbázisnak vannak hozzárendelt feladatai jim és pam.

Most tegyük egy kicsit érdekesebbé a szabályt. Tegyük fel, hogy ha egy felhasználó menedzser, akkor az összes feladatot láthatja, függetlenül attól, hogy kinek van rendelve:

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

A beépített módszert használtuk hasRole annak ellenőrzése, hogy a hitelesített felhasználónak van-e MANAGER szerepe. Ha hasRole true értéket ad vissza, a feladat megmarad a végső listában. Tehát, ha a felhasználó menedzser, akkor a szabály a lista minden elemére igaz lesz. Így a végső lista az összes elemet tartalmazza.

Most szűrjük le az a paraméterként átadott listát mentés módszer segítségével @Előszűrő:

@PreFilter ("hasRole ('MANAGER') vagy filterObject.assignee == authentication.name") Iterálható mentés (Iterable entitások) {// ...}

A biztonsági szabály megegyezik azzal, amelyet a @PostFilter példa. A fő különbség itt az, hogy a listaelemeket a metódus végrehajtása előtt szűrjük, lehetővé téve számunkra egyes elemek eltávolítását a listából, megakadályozva azok mentését az adatbázisba.

Így jim, aki nem menedzser, megpróbálhatja menteni a feladatok listáját, amelyek közül néhányat hozzárendeltek pam. Csak azok a feladatok, amelyekre rárendeltek jim bekerül, a többi figyelmen kívül marad.

4. Teljesítmény nagy listákon

@Előszűrő nagyon jó és könnyen használható, de nagyon nagy listák kezelésekor nem hatékony, mivel a lekérési művelet az összes adatot lekéri, és utána alkalmazza a szűrőt.

Képzelje el például, hogy több ezer feladat van az adatbázisunkban, és be akarjuk szerezni az öt feladatot, amelyek jelenleg pam. Ha használjuk @Előszűrő, az adatbázis-művelet először az összes feladatot be fogja tölteni, és mindegyiken végigjárja a nem hozzárendeltek kiszűrését. pam.

5. Következtetés

Ez a rövid cikk elmagyarázta, hogyan lehet egyszerű, de biztonságos alkalmazást létrehozni a Spring Security segítségével @Előszűrő és @PostFilter annotációk.

Ellenőrizze a teljes kód példát ebben a Github-tárban.