Uvod u proljetne sigurnosne izraze

1. Uvod

U ovom uputstvu usredotočit ćemo se na Spring Security Expressions i naravno na praktične primjere s tim izrazima.

Prije razmatranja složenijih implementacija (kao što je ACL), važno je dobro razumjeti sigurnosne izraze - jer oni mogu biti prilično fleksibilni i moćni ako se pravilno koriste.

Ovaj je članak proširenje Spring Security Expressions - primjer hasRole.

2. Ovisnosti Mavena

Da biste koristili Spring Security, u svoj morate uključiti sljedeći odjeljak pom.xml datoteka:

  org.springframework.security proljeće-sigurnost-web 5.2.3.OBLAŽENJE 

Najnoviju verziju možete pronaći ovdje.

I kratka napomena - ova ovisnost pokriva samo Spring Security; ne zaboravite dodati spring-core i proljeće-kontekst za cjelovitu web aplikaciju.

3. Konfiguracija

Prvo, pogledajmo Java konfiguraciju.

Produžit ćemo WebSecurityConfigurerAdapter - tako da imamo mogućnost priključiti se na bilo koju točku proširenja koju nudi osnovna klasa:

@Configuration @EnableAutoConfiguration @EnableWebSecurity @EnableGlobalMethodSecurity (prePostEnabled = true) javna klasa SecurityJavaConfig proširuje WebSecurityConfigurerAdapter {...}

Naravno, možemo napraviti i XML konfiguraciju:

4. Izrazi web sigurnosti

Sada, krenimo s razmatranjem sigurnosnih izraza:

  • hasRole, hasAnyRole
  • imaAutority, hasAnyAuthority
  • dozvolaSve, poricatiSve
  • isAnonymous, isRememberMe, jeAutentificiran, isFullyAuthenticated
  • glavni, ovjera
  • imaDopuštenje

A sada ćemo detaljno preći na svaku od njih.

4.1. hasRole, hasAnyRole

Ovi su izrazi odgovorni za definiranje kontrole pristupa ili autorizacije određenim URL-ovima ili metodama u vašoj aplikaciji.

Pogledajmo primjer:

@Override zaštićena void konfiguracija (konačni HttpSecurity http) baca izuzetak {... .antMatchers ("/ auth / admin / *"). HasRole ("ADMIN") .antMatchers ("/ auth / *"). HasAnyRole ("ADMIN "," USER ") ...} 

U ovom primjeru određujemo pristup svim vezama koje počinju sa / auth / ograničeno na korisnike koji su prijavljeni s ulogom KORISNIK ili uloga UPRAVNIK. Štoviše, za pristup vezama koje počinju s / auth / admin / moramo imati UPRAVNIK uloga u sustavu.

Ista konfiguracija može se postići u XML datoteci, tako da se napiše:

4.2. hasAuthority, hasAnyAuthority

Uloge i autoriteti slični su u proljeće.

Glavna razlika je u tome što uloge imaju posebnu semantiku - počevši od Spring Security 4, "ULOGA_'Prefiks se automatski dodaje (ako ga već nema) bilo kojom metodom povezanom s ulogom.

Tako hasAuthority ('ROLE_ADMIN') je sličan hasRole (‘UPRAVNIK’) jer 'ULOGA_'Prefiks se dodaje automatski.

Ali dobra stvar kod korištenja ovlasti je ta što ne moramo koristiti ULOGA_ prefiks uopće.

Evo kratkog primjera u kojem definiramo korisnike s određenim ovlastima:

@Override zaštićena void konfiguracija (AuthenticationManagerBuilder auth) baca iznimku {auth.inMemoryAuthentication () .withUser ("user1"). Password (encoder (). Encode ("user1Pass")) .authorities ("USER") .and (). withUser ("admin"). password (encoder (). encode ("adminPass")) .authorities ("ADMIN"); } 

Tada naravno možemo koristiti ove izraze vlasti:

@Override zaštićena void konfiguracija (konačni HttpSecurity http) baca iznimku {... .antMatchers ("/ auth / admin / *"). HasAuthority ("ADMIN") .antMatchers ("/ auth / *"). HasAnyAuthority ("ADMIN "," USER ") ...}

Kao što vidimo - ovdje uopće ne spominjemo uloge. Uz to, počevši od proljeća 5, trebamo i PasswordEncoder grah:

@Bean public PasswordEncoder passwordEncoder () {return new BCryptPasswordEncoder (); }

Konačno - istu funkciju naravno možemo postići i pomoću XML konfiguracije:

I:

4.3. dozvoliSve, odbijSve

Te su dvije bilješke također prilično jednostavne. Ili možemo dopustiti pristup nekom URL-u u našoj usluzi ili možemo odbiti pristup.

Pogledajmo primjer:

... .antMatchers ("/ *"). allowAll () ...

Ovom konfiguracijom odobrit ćemo svim korisnicima (i anonimnim i prijavljenim) pristup stranici koja započinje s "/" (na primjer, naša početna stranica).

Također možemo zabraniti pristup cijelom našem URL prostoru:

... .antMatchers ("/ *"). denyAll () ...

I opet, ista konfiguracija može se napraviti i s XML konfiguracijom:

4.4. isAnonymous, isRememberMe, isAuthenticated, isFullyAuthenticated

U ovom se pododjeljku usredotočujemo na izraze koji se odnose na status prijave korisnika. Krenimo od korisnika koji se nije prijavio na našu stranicu. Određivanjem sljedećeg u Javinoj konfiguraciji omogućavamo svim neovlaštenim korisnicima pristup našoj glavnoj stranici:

... .antMatchers ("/ *"). anonimno () ...

Isto u XML konfiguraciji:

Ako želimo osigurati web stranicu da će se svi koji je koriste morati prijaviti, trebamo je koristiti isAuthenticated () metoda:

... .antMatchers ("/ *"). authenticated () ...

ili XML verzija:

Štoviše, imamo dva dodatna izraza, isRememberMe () i isFullyAuthenticated (). Korištenjem kolačića Spring pruža mogućnosti pamćenja, tako da nije potrebno svaki put se prijaviti u sustav. Možete pročitati više o Zapamti me ovdje.

Kako bismo omogućili pristup korisnicima koji su bili prijavljeni samo funkcijom zapamti me, možemo koristiti ovo:

... .antMatchers ("/ *"). RememberMe () ...

ili XML verzija:

Konačno, neki dijelovi naših usluga zahtijevaju ponovnu autentifikaciju korisnika čak i ako je korisnik već prijavljen. Na primjer, korisnik želi promijeniti postavke ili podatke o plaćanju; naravno je dobra praksa tražiti ručnu provjeru autentičnosti u osjetljivijim područjima sustava.

Da bismo to učinili, možemo navesti isFullyAuthenticated (), koji se vraća pravi ako korisnik nije anoniman ili korisnik koji me pamti:

... .antMatchers ("/ *"). potpunoAuthenticated () ...

ili XML verzija:

4.5. glavnica, autentifikacija

Ovi izrazi omogućuju pristup datoteci glavni objekt koji predstavlja trenutnog ovlaštenog (ili anonimnog) korisnika i trenutnog Ovjera objekt iz SecurityContext, odnosno.

Možemo, na primjer, koristiti glavni za učitavanje korisnikove e-pošte, avatara ili bilo kojih drugih podataka kojima je dostupan prijavljeni korisnik.

I ovjera pruža informacije o cjelini Ovjera objekt, zajedno s dodijeljenim ovlastima.

Oboje su detaljnije opisani u sljedećem članku: Dohvaćanje korisničkih podataka u Spring Security.

4.6. imaDopuštenje Apis

Ovaj je izraz dokumentiran i namijenjen je povezivanju između sustava izraza i ACL sustava Spring Securitya, što nam omogućuje da odredimo ograničenja autorizacije na pojedinačnim objektima domene, na temelju apstraktnih dozvola.

Pogledajmo primjer. Imamo uslugu koja omogućuje suradničko pisanje članaka, s glavnim urednikom koji odlučuje koji će članak predložiti drugi autori.

Kako bismo omogućili upotrebu takve usluge, možemo stvoriti sljedeće metode s metodama kontrole pristupa:

@PreAuthorize ("hasPermission (#articleId, 'isEditor')") javna praznina acceptArticle (članak u članku) {…}

Samo ovlašteni korisnik može nazvati ovu metodu, a također mora imati odobrenje isEditor u službi.

Također se moramo sjetiti da izričito konfiguriramo a Procjenitelj dozvole u našem kontekstu aplikacije:

gdje customInterfaceImplementation bit će klasa koja provodi Procjenitelj dozvole.

To naravno možemo učiniti i s Java konfiguracijom:

@Override zaštićen MethodSecurityExpressionHandler expressionHandler () {DefaultMethodSecurityExpressionHandler expressionHandler = novi DefaultMethodSecurityExpressionHandler (); expressionHandler.setPermissionEvaluator (nova CustomInterfaceImplementation ()); return expressionHandler; }

5. Zaključak

Ovaj je vodič sveobuhvatan uvod i vodič za Spring Security Expressions.

Svi ovdje raspravljeni primjeri dostupni su na projektu GitHub.