Úvod do jarných bezpečnostných výrazov
1. Úvod
V tomto tutoriáli sa zameriame na jarné bezpečnostné výrazy a samozrejme na praktické príklady týchto výrazov.
Predtým, ako sa pozrieme na zložitejšie implementácie (napríklad ACL), je dôležité dôkladne porozumieť bezpečnostným výrazom - pretože pri správnom použití môžu byť dosť flexibilné a výkonné.
Tento článok je rozšírením jarných bezpečnostných výrazov - príklad hasRole.
2. Maven závislosti
Aby ste mohli používať Spring Security, musíte do svojho súboru zahrnúť nasledujúcu časť pom.xml spis:
org.springframework.security spring-security-web 5.2.3.RELEASE
Najnovšiu verziu nájdete tu.
A krátka poznámka - táto závislosť sa týka iba jarnej bezpečnosti; nezabudni pridať spring-core a jarný kontext pre úplnú webovú aplikáciu.
3. Konfigurácia
Najskôr sa pozrime na konfiguráciu Java.
Predĺžime WebSecurityConfigurerAdapter - aby sme mali možnosť pripojiť sa k niektorému z rozširujúcich bodov, ktoré ponúka základná trieda:
@Configuration @EnableAutoConfiguration @EnableWebSecurity @EnableGlobalMethodSecurity (prePostEnabled = true) verejná trieda SecurityJavaConfig rozširuje WebSecurityConfigurerAdapter {...}
Môžeme samozrejme urobiť aj konfiguráciu XML:
4. Výrazy zabezpečenia webu
Teraz sa pozrime na bezpečnostné výrazy:
- hasRole, hasAnyRole
- hasAuthority, hasAnyAuthority
- povolenieAll, popierať všetko
- je anonymný, isRememberMe, isAuthenticated, isFullyAuthenticated
- principál, Overenie
- máPovolenie
A poďme si teraz podrobne prečítať každú z nich.
4.1. hasRole, hasAnyRole
Tieto výrazy sú zodpovedné za definovanie riadenia prístupu alebo autorizácie konkrétnych adries URL alebo metód vo vašej aplikácii.
Pozrime sa na príklad:
@Override protected void configure (konečná HttpSecurity http) vyvolá výnimku {... .antMatchers ("/ auth / admin / *"). HasRole ("ADMIN") .antMatchers ("/ auth / *"). HasAnyRole ("ADMIN" "," USER ") ...}
V tomto príklade špecifikujeme prístup ku všetkým odkazom začínajúcim na / auth / obmedzené na používateľov, ktorí sú prihlásení pomocou roly UŽÍVATEĽ alebo rola SPRÁVCA. Navyše, na prístup k odkazom začínajúcim na / auth / admin / potrebujeme mať SPRÁVCA úlohu v systéme.
Rovnakú konfiguráciu je možné dosiahnuť v súbore XML napísaním:
4.2. hasAuthority, hasAnyAuthority
Úlohy a právomoci sú podobné na jar.
Hlavný rozdiel je v tom, že role majú špeciálnu sémantiku - počnúc Spring Security 4, „ROLE_„Predpona je automaticky pridaná (ak tam ešte nie je) akoukoľvek metódou súvisiacou s rolou.
Takže hasAuthority („ROLE_ADMIN“) je podobný hasRole („ADMIN“) pretože 'ROLE_„Predpona sa pridá automaticky.
Ale dobrá vec pri používaní orgánov je, že nemusíme používať ROLE_ prefix vôbec.
Tu je rýchly príklad, kde definujeme používateľov s konkrétnymi autoritami:
@Override protected void configure (AuthenticationManagerBuilder auth) hodí výnimku {auth.inMemoryAuthentication () .withUser ("user1"). Heslo (encoder (). Encode ("user1Pass")) .authorities ("USER") .and (). withUser ("admin"). heslo (encoder (). encode ("adminPass")) .authorities ("ADMIN"); }
Potom môžeme samozrejme použiť tieto autoritné výrazy:
@Override protected void configure (konečná HttpSecurity http) vyvolá výnimku {... .antMatchers ("/ auth / admin / *"). HasAuthority ("ADMIN") .antMatchers ("/ auth / *"). HasAnyAuthority ("ADMIN" "," USER ") ...}
Ako vidíme - tu sa vôbec nezmieňujeme o rolách. Od jari 5 navyše potrebujeme a PasswordEncoder fazuľa:
@Bean public PasswordEncoder passwordEncoder () {vrátiť nový BCryptPasswordEncoder (); }
Nakoniec - rovnakú funkcionalitu môžeme samozrejme dosiahnuť aj pomocou konfigurácie XML:
A:
4.3. allowAll, denyAll
Tieto dve anotácie sú tiež celkom priame. Buď môžeme povoliť prístup na niektoré adresy URL v našej službe, alebo môžeme prístup odmietnuť.
Pozrime sa na príklad:
... .antMatchers ("/ *"). permitAll () ...
Vďaka tejto konfigurácii autorizujeme všetkých používateľov (anonymných aj prihlásených) na prístup na stránku začínajúcu na „/“ (napríklad na našu domovskú stránku).
Môžeme tiež odmietnuť prístup k celému nášmu priestoru URL:
... .antMatchers ("/ *"). denyAll () ...
Rovnakú konfiguráciu je možné vykonať aj v konfigurácii XML:
4.4. isAnonymous, isRememberMe, isAuthenticated, isFullyAuthenticated
V tejto podkapitole sa zameriavame na výrazy súvisiace so stavom prihlásenia používateľa. Začnime s používateľom, ktorý sa neprihlásil na našu stránku. Zadaním nasledujúcich údajov v konfigurácii Java umožňujeme všetkým neoprávneným používateľom prístup na našu hlavnú stránku:
... .antMatchers ("/ *"). anonymous () ...
To isté v konfigurácii XML:
Ak chceme zabezpečiť webovú stránku, ktorú bude musieť každý, kto ju používa, prihlásiť sa, musíme ju použiť isAuthenticated () metóda:
... .antMatchers ("/ *"). authenticated () ...
alebo XML verzia:
Okrem toho máme dva ďalšie výrazy, isRememberMe () a isFullyAuthenticated (). Vďaka použitiu cookies umožňuje Spring funkcie zapamätania si, takže nie je potrebné sa zakaždým prihlasovať do systému. Môžete si prečítať viac o Pamätáš si ma tu.
Na umožnenie prístupu používateľom, ktorí boli prihlásení iba funkciou zapamätať si, môžeme použiť toto:
... .antMatchers ("/ *"). rememberMe () ...
alebo XML verzia:
Niektoré časti našich služieb nakoniec vyžadujú, aby bol používateľ znova autentizovaný, aj keď je už prihlásený. Napríklad chce používateľ zmeniť nastavenia alebo platobné údaje; osvedčeným postupom je samozrejme požiadať o manuálne overenie totožnosti v citlivejších oblastiach systému.
Za týmto účelom môžeme spresniť isFullyAuthenticated (), ktorý sa vracia pravda ak používateľ nie je anonymný alebo si ho pamätajte:
... .antMatchers ("/ *"). fullyAuthenticated () ...
alebo verzia XML:
4.5. principál, autentifikácia
Tieto výrazy umožňujú prístup k principál objekt predstavujúci aktuálneho autorizovaného (alebo anonymného) používateľa a aktuálneho Overenie objekt z SecurityContext, resp.
Môžeme napríklad použiť principál načítať e-mail, avatar alebo akékoľvek ďalšie údaje, ktoré sú prístupné prihlásenému používateľovi.
A Overenie poskytuje informácie o úplnom znení Overenie spolu s udelenými orgánmi.
Obidve sú podrobnejšie popísané v nasledujúcom článku: Načítanie informácií o používateľovi v jarnom zabezpečení.
4.6. máPovolenie API
Tento výraz je zdokumentovaný a je určený na premostenie medzi expresným systémom a systémom ACL spoločnosti Spring Security, čo nám umožňuje určiť autorizačné obmedzenia pre jednotlivé doménové objekty na základe abstraktných povolení.
Pozrime sa na príklad. Máme službu, ktorá umožňuje spoločné písanie článkov a hlavný editor rozhoduje o tom, ktorý článok navrhnutý inými autormi by mal byť publikovaný.
Aby sme umožnili použitie takejto služby, môžeme vytvoriť nasledujúce metódy s metódami riadenia prístupu:
@PreAuthorize ("hasPermission (#articleId, 'isEditor')") public void acceptArticle (článok článku) {…}
Túto metódu môže volať iba oprávnený používateľ a tiež používateľ musí mať povolenie isEditor v službe.
Musíme si tiež pamätať, aby ste explicitne nakonfigurovali a Hodnotiteľ povolení v našom kontexte aplikácie:
kde customInterfaceImplementation bude trieda, ktorá implementuje Hodnotiteľ povolení.
Samozrejme to môžeme urobiť aj s konfiguráciou Java:
@Override chránený MethodSecurityExpressionHandler expressionHandler () {DefaultMethodSecurityExpressionHandler expressionHandler = nový DefaultMethodSecurityExpressionHandler (); expressionHandler.setPermissionEvaluator (nový CustomInterfaceImplementation ()); návrat výrazHandler; }
5. Záver
Tento tutoriál predstavuje komplexný úvod a sprievodcu jarnými bezpečnostnými výrazmi.
Všetky tu diskutované príklady sú k dispozícii v projekte GitHub.