Vårsikkerhet - @ PreFilter og @ PostFilter

1. Oversikt

I denne artikkelen vil vi lære hvordan du bruker @FreFilter og @PostFilter merknader for å sikre operasjoner i en vårapplikasjon.

Når den brukes sammen med den autentiserte hovedinformasjonen, @FreFilter og @PostFilter lar oss definere detaljerte sikkerhetsregler ved hjelp av Spring Expression Language.

2. Introduksjon @FreFilter og @PostFilter

Enkelt sagt, den @FreFilter og @PostFilter merknader er brukes til å filtrere lister over objekter basert på tilpassede sikkerhetsregler vi definerer.

@PostFilter definerer en regel for filtrering av returlisten til en metode, etter bruke den regelen på hvert element i listen. Hvis den evaluerte verdien er sann, vil varen holdes i listen. Ellers blir varen fjernet.

@FreFilter fungerer på en veldig lik måte, men filtreringen blir brukt på en liste som blir sendt som en inputparameter til den merkede metoden.

Begge kommentarene kan brukes på metoder eller typer (klasser og grensesnitt). Vi bruker dem bare på metoder gjennom hele denne artikkelen.

Disse kommentarene er ikke aktive som standard - vi må aktivere dem med @EnableGlobalMethodSecurity kommentar og prePostEnabled = true - i vår sikkerhetskonfigurasjon:

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

3. Skrive sikkerhetsregler

For å skrive sikkerhetsreglene i disse to kommentarene - vi bruker Spring-EL-uttrykk; vi kan også bruke det innebygde objektet filterObject for å få en referanse til det spesifikke listeelementet som testes.

Spring Security tilbyr mange andre innebygde objekter for å lage veldig spesifikke og eksakte regler.

For eksempel, Vi kan bruke @FreFilter for å sjekke om rettighetshaver eiendommen til en Oppgave objektet er lik Navn av den for tiden autentiserte brukeren:

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

Vi har brukt @PostFilter kommentar her siden vi vil at metoden skal utføres og få alle oppgaver først, og de sender hver eneste oppgave fra listen gjennom filterregelen vår.

Så hvis den autentiserte brukeren er det michael, den endelige listen over oppgaver som returneres av finn alle metoden vil bare inneholde oppgavene som er tildelt michael, selv om databasen har oppgaver tilordnet jim og pam.

La oss nå gjøre regelen litt mer interessant. Anta at hvis en bruker er en leder, kan de se alle oppgavene, uavhengig av hvem de er tildelt:

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

Vi har brukt den innebygde metoden hasRole for å sjekke om den autentiserte brukeren har rollen som MANAGER. Hvis hasRole returnerer sant, vil oppgaven holdes i den endelige listen. Så hvis brukeren er leder, vil regelen returnere sann for hvert element i listen. Dermed vil den endelige listen inneholde alle elementene.

La oss nå filtrere en liste sendt som en parameter til en lagre metoden bruker @FreFilter:

@PreFilter ("hasRole ('MANAGER') eller filterObject.assignee == authentication.name") Iterabel lagring (Iterable enheter) {// ...}

Sikkerhetsregelen er den samme som den vi har brukt på @PostFilter eksempel. Hovedforskjellen her er at listeelementene blir filtrert før metoden kjøres, slik at vi kan fjerne noen elementer fra listen, slik at de ikke blir lagret i databasen.

jim, som ikke er leder, kan prøve å lagre en liste over oppgaver, hvorav noen er tildelt pam. Imidlertid bare de oppgavene som er tildelt jim vil bli inkludert, vil de andre bli ignorert.

4. Ytelse på store lister

@FreFilter er veldig kult og enkelt å bruke, men det kan være ineffektivt når du arbeider med veldig store lister, siden hentingsoperasjonen vil hente alle dataene og bruke filteret etterpå.

Tenk deg for eksempel at vi har tusenvis av oppgaver i databasen vår, og vi ønsker å hente de fem oppgavene som for tiden er tildelt pam. Hvis vi bruker @FreFilter, databasedriften vil hente alle oppgavene først, og gjenta dem alle for å filtrere ut de som ikke er tildelt pam.

5. Konklusjon

Denne raske artikkelen forklarte hvordan du lager en enkel, men sikker applikasjon ved hjelp av Spring Security's @FreFilter og @PostFilter kommentarer.

Sjekk hele kodeeksemplet i dette Github-depotet.


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