Prihlásenie do jarného bezpečnostného formulára

1. Úvod

Tento článok sa zameria na Prihláste sa s jarným zabezpečením. Budeme stavať na jednoduchom predchádzajúcom príklade jarného MVC, ktorý je nevyhnutnou súčasťou nastavenia webovej aplikácie spolu s mechanizmom prihlásenia.

2. Závislosti Maven

Pri práci s Spring Boot sa zabezpečenie jarného štartéra-štartéra štartér automaticky zahrnie všetky závislosti ako napr pružinové bezpečnostné jadro, jar-bezpecnostny web a spring-security-config okrem iného:

 org.springframework.boot spring-boot-starter-security 2.3.3.RELEASE 

Ak nepoužívame Spring Boot, prečítajte si článok Spring Security with Maven, ktorý popisuje, ako pridať všetky požadované závislosti. Oba štandardné jar-bezpecnostny web a spring-security-config bude požadované.

3. Jarná bezpečnosť Java Konfigurácia

Začnime vytvorením triedy konfigurácie Spring Security, ktorá sa rozširuje WebSecurityConfigurerAdapter.

Pridaním @EnableWebSecurity, získame podporu integrácie Spring Security a MVC:

@Configuration @EnableWebSecurity verejná trieda SecSecurityConfig rozširuje WebSecurityConfigurerAdapter {@Override protected void configure (final AuthenticationManagerBuilder auth) vyvolá výnimku {// overovací manažér (pozri nižšie)} @Override protected void configure (final HttpSecurity http) vyvolá výnimku {// http pre autorizáciu požiadaviek a prihlásenie do formulára (pozri nižšie)}}

V tomto príklade sme použili autentifikáciu v pamäti a definovali sme 3 používateľov.

Ďalej si prejdeme prvky, ktoré sme použili na vytvorenie konfigurácie prihlásenia do formulára.

Najprv vytvorme nášho správcu autentifikácie.

3.1. Správca autentifikácie

Poskytovateľ autentifikácie je podporený jednoduchou implementáciou v pamäti - InMemoryUserDetailsManager konkrétne. To je užitočné pre rýchle prototypovanie, keď ešte nie je potrebný mechanizmus úplnej perzistencie:

Konfigurácia chráneného prázdna (konečné overenie AuthenticationManagerBuilder) vyvolá výnimku {auth.inMemoryAuthentication () .withUser ("user1"). password (passwordEncoder (). encode ("user1Pass")). role ("USER"). a () .withUser ("user2"). heslo (passwordEncoder (). encode ("user2Pass")). role ("USER"). a () .withUser ("admin"). heslo (passwordEncoder (). encode ("adminPass") ) .roles („ADMIN“); }

Tu nakonfigurujeme troch používateľov s pevným kódom používateľského mena, hesla a roly.

Počnúc jarom 5 musíme tiež definovať kódovač hesiel. V našom príklade sme použili BCryptPasswordEncoder:

@Bean public PasswordEncoder passwordEncoder () {vrátiť nový BCryptPasswordEncoder (); }

Ďalej nakonfigurujme HttpSecurity.

3.2. Konfigurácia na autorizáciu požiadaviek

Začneme tým, že urobíme potrebné konfigurácie na autorizáciu požiadaviek.

Tu povoľujeme anonymný prístup /Prihlásiť sa aby sa používatelia mohli autentifikovať. Obmedzujúce / admin do SPRÁVCA úlohy a zabezpečenie všetkého ostatného:

@Override protected void configure (final HttpSecurity http) vyvolá výnimku {http .csrf (). Disable () .authorizeRequests () .antMatchers ("/ admin / **"). HasRole ("ADMIN") .antMatchers ("/ anonymous) * "). anonymous () .antMatchers (" / login * "). permitAll () .anyRequest (). autentifikované (). a () // ...}

Upozorňujeme, že poradie antMatchers () prvkov je významný - na prvom mieste musia byť konkrétnejšie pravidlá, až potom všeobecnejšie.

3.3. Konfigurácia pre prihlásenie do formulára

Ďalej rozšírime vyššie uvedenú konfiguráciu pre prihlásenie a odhlásenie z formulára:

@Override protected void configure (final HttpSecurity http) vyvolá výnimku {http // ... .and () .formLogin () .loginPage ("/ login.html") .loginProcessingUrl ("/ perform_login") .defaultSuccessUrl ("/ homepage.html ", true) .failureUrl (" / login.html? error = true ") .failureHandler (authenticationFailureHandler ()) .and () .logout () .logoutUrl (" / perform_logout ") .deleteCookies (" JSESSIONID ") ) .logoutSuccessHandler (logoutSuccessHandler ()); }
  • loginPage () - vlastná prihlasovacia stránka
  • loginProcessingUrl () - adresa URL, na ktorú sa má odoslať používateľské meno a heslo
  • defaultSuccessUrl () - vstupná stránka po úspešnom prihlásení
  • failureUrl () - vstupná stránka po neúspešnom prihlásení
  • odhlásiť sa () - vlastné odhlásenie

4. Pridajte jarné zabezpečenie do webovej aplikácie

Ak chcete použiť vyššie definovanú konfiguráciu Spring Security, je potrebné ju pripojiť k webovej aplikácii.

Použijeme WebApplicationInitializer, takže nemusíme poskytovať žiadne web.xml:

verejná trieda AppInitializer implementuje WebApplicationInitializer {@Override public void onStartup (ServletContext sc) {AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext (); root.register (SecSecurityConfig.class); sc.addListener (nový ContextLoaderListener (root)); sc.addFilter ("securityFilter", nový DelegatingFilterProxy ("springSecurityFilterChain")) .addMappingForUrlPatterns (null, false, "/ *"); }}

Upozorňujeme, že tento inicializátor nie je potrebný, ak používame aplikáciu Spring Boot. V našom článku o automatickej konfigurácii zabezpečenia Spring Boot sa dozviete viac podrobností o načítaní konfigurácie zabezpečenia v Spring Boot.

5. Jarná konfigurácia zabezpečenia XML

Pozrime sa tiež na zodpovedajúcu konfiguráciu XML.

Celý projekt využíva konfiguráciu Java, takže musíme importovať konfiguračný súbor XML cez Java @ Konfigurácia trieda:

@Configuration @ImportResource ({"classpath: webSecurityConfig.xml"}) verejná trieda SecSecurityConfig {verejná SecSecurityConfig () {super (); }}

A jarná konfigurácia zabezpečenia XML - webSecurityConfig.xml:

6. web.xml

Pred zavedením jari 4, sme nakonfigurovali konfiguráciu Spring Security v web.xml - do štandardnej pružiny MVC bol pridaný iba ďalší filter web.xml:

Jarná zabezpečená aplikácia springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain / * 

Filter - DelegatingFilterProxy - jednoducho deleguje na jar spravovanú fazuľu - FilterChainProxy - ktorý sám je schopný ťažiť z úplného riadenia životného cyklu jarných bôbov a podobne.

7. Prihlasovací formulár

Stránka prihlasovacieho formulára bude zaregistrovaná u Spring MVC pomocou priameho mechanizmu na mapovanie názvov pohľadov na adresy URL, pričom medzi nimi nie je potrebný explicitný radič:

registry.addViewController ("/ login.html");

To samozrejme zodpovedá login.jsp:

Užívateľ:
Heslo:

The Jarný prihlasovací formulár má nasledujúce príslušné artefakty:

  • Prihlásiť sa - URL, na ktoré je formulár POSTed, aby sa spustil proces autentifikácie
  • používateľské meno - užívateľské meno
  • heslo - heslo

8. Ďalšia konfigurácia jarného prihlásenia

Keď sme vyššie predstavili jarnú bezpečnostnú konfiguráciu, stručne sme diskutovali o niekoľkých konfiguráciách mechanizmu prihlásenia - poďme teraz do nejakých podrobností.

Jedným z dôvodov na potlačenie väčšiny predvolených nastavení v jarnej bezpečnosti je skryť skutočnosť, že aplikácia je zabezpečená pomocou Spring Security a minimalizovať informácie, ktoré potenciálny útočník vie o aplikácii.

Plne nakonfigurovaný prvok prihlásenia vyzerá takto:

@Override protected void configure (HttpSecurity http) vyvolá výnimku {http.formLogin () .loginPage ("/ login.html") .loginProcessingUrl ("/ perform_login") .defaultSuccessUrl ("/ homepage.html", true) .failureUrl ( "/login.html?error=true")}

Alebo zodpovedajúca konfigurácia XML:

8.1. Prihlasovacia stránka

Ďalej sa pozrime, ako môžeme nakonfigurovať vlastnú prihlasovaciu stránku pomocou metóda loginPage ():

http.formLogin () .loginPage ("/ login.html")

Alebo prostredníctvom konfigurácie XML:

login-page = '/ login.html'

Ak to neurčíme, Spring Security vygeneruje veľmi jednoduchý prihlasovací formulár na serveri /Prihlásiť sa URL.

8.2. POST URL pre prihlásenie

Predvolená adresa URL, na ktorú POSTUPNÉ PRIHLÁŠENIE POSTÚPI na spustenie procesu autentifikácie, je /Prihlásiť sa ktorý býval / j_spring_security_check pred jarnou bezpečnosťou 4.

Môžeme použiť loginProcessingUrl spôsob prepísania tejto adresy URL:

http.formLogin () .loginProcessingUrl ("/ perform_login")

Alebo prostredníctvom konfigurácie XML:

login-processing-url = "/ perform_login"

Dobrým dôvodom na prepísanie tejto predvolenej adresy URL je skrytie skutočnosti, že aplikácia je skutočne zabezpečená pomocou Spring Security - tieto informácie by nemali byť dostupné externe.

8.3. Cieľová stránka úspechu

Po úspešnom prihlásení je používateľ presmerovaný na stránku, ktorá je predvolene koreňom webovej aplikácie.

Môžeme to prepísať cez defaultSuccessUrl () metóda:

http.formLogin () .defaultSuccessUrl ("/ homepage.html")

Alebo s konfiguráciou XML:

default-target-url = "/ homepage.html"

V prípade, že always-use-default-target je nastavená na hodnotu true, potom je používateľ vždy presmerovaný na túto stránku. Ak je tento atribút nastavený na hodnotu False, bude používateľ pred výzvou na overenie presmerovaný na predchádzajúcu stránku, ktorú chcel navštíviť.

8.4. Cieľová stránka pri zlyhaní

Rovnako ako pri prihlasovacej stránke, aj stránka pri zlyhaní prihlásenia sa automaticky generuje pomocou Spring Spring at /Prihlásiť sa?chyba v predvolenom nastavení.

Ak to chceme prepísať, môžeme použiť failureUrl () metóda:

http.formLogin () .failureUrl ("/ login.html? error = true")

Alebo s XML:

authentication-failure-url = "/ login.html? error = true"

9. Záver

V tomto Príklad jarného prihlásenia, nakonfigurovali sme jednoduchý proces autentifikácie - diskutovali sme o formulári Spring Security Login, konfigurácii zabezpečenia a niektorých pokročilejších dostupných prispôsobeniach.

Implementáciu tohto tutoriálu Spring Login nájdete v projekte GitHub - jedná sa o projekt založený na Eclipse, takže by malo byť ľahké ho importovať a spustiť tak, ako je.

Keď je projekt spustený lokálne, k vzorovému kódu HTML je možné pristupovať na adrese:

//localhost:8080/spring-security-mvc-login/login.html