Dodijeljen autoritet naspram uloge u proljetnoj sigurnosti

1. Pregled

U ovom ćemo kratkom članku objasniti suptilna, ali značajna razlika između a Uloga i a OdobrenoAutority u proljetnoj sigurnosti. Za detaljnije informacije o ulogama i ovlastima, pogledajte članak ovdje.

2. OdobrenoAutority

U proljetnoj sigurnosti možemo mislite na svaku OdobrenoAutority kao individualna privilegija. Primjeri mogu uključivati PROČITAJ_AUTORITET, WRITE_PRIVILEGE, ili čak CAN_EXECUTE_AS_ROOT. Važno je razumjeti to naziv je proizvoljan.

Kada koristite OdobrenoAutority izravno, na primjer upotrebom izraza kao hasAuthority (‘READ_AUTHORITY’), mi smo ograničavanje pristupa na sitnozrnati način.

Kao što vjerojatno možete shvatiti, možemo se pozvati na koncept autoritet pomoću privilegija također.

3. Uloga kao autoritet

Slično tome, u Spring Securityu možemo mislite na svaku Uloga kao grubozrnasta OdobrenoAutority koji je predstavljen kao a Niz i s prefiksom "ULOGA. Kada koristite Uloga izravno, poput izraza poput hasRole (“UPRAVNIK”), ograničavamo pristup grubo zrnato.

Vrijedno je napomenuti da je zadani “ULOGA" Prefiks je moguće konfigurirati, ali objašnjenje kako to učiniti izvan je dosega ovog članka.

Suštinska razlika između ove dvije je semantika koju pridajemo načinu na koji koristimo značajku. Za okvir je razlika minimalna - i u osnovi se s njima bavi na potpuno isti način.

4. Uloga kao spremnik

Sad kad smo vidjeli kako okvir koristi uloga koncepta, hajde da brzo razgovaramo o alternativi - i to je koristeći uloge kao spremnike ovlasti / privilegija.

Ovo je pristup ulogama na višoj razini - što ih čini više poslovnim, a ne implementacijskim.

Proljetni sigurnosni okvir ne daje smjernice u pogledu načina na koji bismo trebali koristiti koncept, tako da je izbor u potpunosti specifičan za implementaciju.

5. Proljetna sigurnosna konfiguracija

Djelomični zahtjev za autorizacijom možemo pokazati ograničavanjem pristupa / protectedbyauthority korisnicima s PROČITAJ_AUTORITET.

Grubozrnati zahtjev za autorizacijom možemo pokazati ograničavanjem pristupa / protectedbyrole korisnicima s ROLE_USER.

Konfigurirajmo takav scenarij u našoj sigurnosnoj konfiguraciji:

@Override zaštićena void konfiguracija (HttpSecurity http) baca iznimku {// ... .antMatchers ("/ protectedbyrole"). HasRole ("USER") .antMatchers ("/ protectedbyauthority"). HasAuthority ("READ_PRIVILEGE") //. ..}

6. Jednostavno pokretanje podataka

Sad kad bolje razumijemo temeljne koncepte, razgovarajmo o stvaranju nekih podataka o postavljanju kad se aplikacija pokrene.

Ovo je, naravno, vrlo jednostavan način da se s nekim korisnicima preliminarnih testova tijekom razvoja pokrene tlo, a ne način na koji biste trebali rukovati podacima u proizvodnji.

Slušat ćemo događaj za osvježavanje konteksta:

@Override @Transactional javna praznina naApplicationEvent (ContextRefreshedEvent event) {MyPrivilege readPrivilege = createPrivilegeIfNotFound ("READ_PRIVILEGE"); MyPrivilege writePrivilege = createPrivilegeIfNotFound ("WRITE_PRIVILEGE"); }

Stvarna implementacija ovdje zapravo nije bitna - i općenito, ovisi o rješenju za upornost koje koristite. Glavna stvar je - ustrajavamo na vlastima koje koristimo u kodu.

7. UserDetailsService

Naša provedba UserDetailsService je mjesto gdje se vrši mapiranje ovlasti. Nakon što se korisnik potvrdi, naša getAuthorities () metoda popunjava i vraća a Pojedinosti o korisniku objekt:

privatna kolekcija getAuthorities (uloge kolekcije) {Ovlasti popisa = novi ArrayList (); za (Uloga uloge: uloge) {Authority.add (novo SimpleGrantedAuthority (role.getName ())); role.getPrivileges (). stream () .map (p -> novo SimpleGrantedAuthority (p.getName ())) .forEach (powers :: add); } vlasti za povratak; }

8. Pokretanje i testiranje primjera

Možemo izvršiti primjer RolesAuthoritiesApplication Java aplikacija, pronađena u projektu GitHub.

Da bismo vidjeli autorizaciju na temelju uloga na djelu, moramo:

  • Pristup // localhost: 8082 / protectedbyrole
  • Provjeri autentičnost kao [e-pošta zaštićena] (lozinka je "korisnik")
  • Napomena o uspješnoj autorizaciji
  • Pristup // localhost: 8082 / protectedbyauthority
  • Napomena o neuspješnoj autorizaciji

Da bismo vidjeli autorizaciju temeljenu na ovlastima, moramo se odjaviti iz aplikacije, a zatim:

  • Pristup // localhost: 8082 / protectedbyauthority
  • Autentifikacija kao [zaštićena e-poštom] / admin
  • Napomena o uspješnoj autorizaciji
  • Pristup // localhsot: 8082 / protectedbyrole
  • Napomena o neuspješnoj autorizaciji

9. Zaključak

U ovom smo brzom vodiču pogledali suptilnu, ali značajnu razliku između a Uloga i a OdobrenoAutority u proljetnoj sigurnosti.