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.