Spring Security - @PreFilter og @PostFilter

1. Oversigt

I denne artikel lærer vi, hvordan du bruger @PreFilter og @PostFilter bemærkninger for at sikre operationer i en Spring-applikation.

Når det bruges sammen med de godkendte hovedoplysninger, @PreFilter og @PostFilter giver os mulighed for at definere detaljerede sikkerhedsregler ved hjælp af Spring Expression Language.

2. Introduktion @PreFilter og @PostFilter

Kort sagt, den @PreFilter og @PostFilter kommentarer er bruges til at filtrere lister over objekter baseret på brugerdefinerede sikkerhedsregler, vi definerer.

@PostFilter definerer en regel til filtrering af returlisten for en metode efter anvende denne regel på hvert element på listen. Hvis den evaluerede værdi er sand, holdes varen på listen. Ellers fjernes varen.

@PreFilter fungerer på en meget lignende måde, men filtreringen anvendes på en liste, der sendes som inputparameter til den kommenterede metode.

Begge kommentarer kan bruges på metoder eller typer (klasser og grænseflader). Vi bruger dem kun på metoder i hele denne artikel.

Disse annoteringer er ikke aktive som standard - vi bliver nødt til at aktivere dem med @EnableGlobalMethodSecurity kommentar og prePostEnabled = sand - i vores sikkerhedskonfiguration:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity (prePostEnabled = true) offentlig klasse WebSecurityConfig udvider WebSecurityConfigurerAdapter {// ...}

3. Skrivning af sikkerhedsregler

For at skrive sikkerhedsreglerne i disse to kommentarer - vi bruger Spring-EL-udtryk; vi kan også bruge det indbyggede objekt filterObject for at få en henvisning til det bestemte listeelement, der testes.

Spring Security leverer mange andre indbyggede objekter til at skabe meget specifikke og nøjagtige regler.

For eksempel, vi kan bruge @PreFilter for at kontrollere, om modtager ejendom af en Opgave objektet er lig med navn af den aktuelt godkendte bruger:

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

Vi har brugt @PostFilter kommentar her, da vi ønsker, at metoden skal udføres og få alle opgaver først, og de sender hver eneste opgave fra listen gennem vores filterregel.

Så hvis den godkendte bruger er Michael, den endelige liste over opgaver, som returneres af findAlle metoden kun indeholder de opgaver, der er tildelt Michael, selvom databasen har opgaver tildelt jim og pam.

Lad os nu gøre reglen lidt mere interessant. Antag, at hvis en bruger er en manager, kan de se alle opgaver, uanset hvem de er tildelt:

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

Vi har brugt den indbyggede metode hasRole for at kontrollere, om den godkendte bruger har rollen som MANAGER. Hvis hasRole returnerer sandt, bliver opgaven gemt i den endelige liste. Så hvis brugeren er en manager, returnerer reglen sandt for hvert element på listen. Således vil den endelige liste indeholde alle emner.

Lad os nu filtrere en liste, der er sendt som en parameter til en Gemme metode ved hjælp af @PreFilter:

@PreFilter ("hasRole ('MANAGER') eller filterObject.assignee == authentication.name") Gendannelig gemme (Iterable enheder) {// ...}

Sikkerhedsreglen er den samme som den, vi har brugt på @PostFilter eksempel. Den største forskel her er, at listeelementerne filtreres, før metoden udføres, hvilket giver os mulighed for at fjerne nogle elementer fra listen, hvilket forhindrer dem i at blive gemt i databasen.

jim, som ikke er manager, kan prøve at gemme en liste over opgaver, hvoraf nogle er tildelt pam. Dog kun de opgaver, der er tildelt jim vil blive inkluderet, vil de andre blive ignoreret.

4. Ydeevne på store lister

@PreFilter er virkelig sejt og let at bruge, men det kan være ineffektivt, når man beskæftiger sig med meget store lister, da hentningsfunktionen henter alle data og anvender filteret bagefter.

Forestil dig for eksempel, at vi har tusindvis af opgaver i vores database, og vi vil hente de fem opgaver, der i øjeblikket er tildelt pam. Hvis vi bruger @PreFilter, databasefunktionen henter først alle opgaver og gentager dem alle for at filtrere dem, der ikke er tildelt pam.

5. Konklusion

Denne hurtige artikel forklarede, hvordan man opretter en enkel, men sikker applikation ved hjælp af Spring Security's @PreFilter og @PostFilter kommentarer.

Kontroller det komplette kodeeksempel i dette Github-arkiv.


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