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.