Prijava za proljetni sigurnosni obrazac

1. Uvod

Ovaj će se članak usredotočiti na Prijavite se s Spring Security. Izgradit ćemo povrh jednostavnog prethodnog primjera Spring MVC, jer je to nužni dio postavljanja web aplikacije zajedno s mehanizmom za prijavu.

2. Ovisnosti Mavena

Kada radite s Spring Boot, spring-boot-starter-sigurnost starter će automatski uključiti sve ovisnosti kao što su opruga-sigurnosna-jezgra, proljeće-sigurnost-web i opruga-sigurnost-konfiguracija između ostalih:

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

U slučaju da ne koristimo Spring Boot, pogledajte članak Spring Security with Maven koji opisuje kako dodati sve potrebne ovisnosti. Obje standardne proljeće-sigurnost-web i opruga-sigurnost-konfiguracija bit će potrebno.

3. Proljetna sigurnosna Java konfiguracija

Počnimo s stvaranjem klase Spring Security konfiguracije koja se proširuje WebSecurityConfigurerAdapter.

Dodavanjem @EnableWebSecurity, dobivamo podršku za Spring Security i integraciju MVC-a:

@Configuration @EnableWebSecurity javna klasa SecSecurityConfig proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (konačna AuthenticationManagerBuilder auth) baca izuzetak {// upravitelj provjere autentičnosti (vidi dolje)} @Override zaštićena void konfiguracija (konačna HttpS konfiguracija http za odobrenje zahtjeva i prijavu putem obrasca (vidi dolje)}}

U ovom smo primjeru koristili autentifikaciju u memoriji i definirali 3 korisnika.

Dalje, prolazimo kroz elemente koje smo koristili za stvaranje konfiguracije prijave za obrazac.

Prvo napravimo svoj Upravitelj autentifikacije.

3.1. Upravitelj provjere autentičnosti

Pružatelj autentifikacije podržan je jednostavnom implementacijom u memoriji - InMemoryUserDetailsManager posebno. Ovo je korisno za brzo izradu prototipova kada još nije potreban puni mehanizam trajanja:

zaštićena void konfiguracija (konačna AuthenticationManagerBuilder auth) baca Exception {auth.inMemoryAuthentication () .withUser ("user1"). password (passwordEncoder (). encode ("user1Pass")). role ("USER"). i () .withUser ("user2"). password (passwordEncoder (). encode ("user2Pass")). role ("USER") .and () .withUser ("admin"). password (passwordEncoder (). encode ("adminPass") ) .roles ("ADMINISTRATOR"); }

Ovdje konfiguriramo tri korisnika s kodiranim korisničkim imenom, lozinkom i ulogom.

Počevši od Proljeća 5, također moramo definirati kodiranje lozinke. U našem smo primjeru koristili BCryptPasswordEncoder:

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

Dalje, konfigurirajmo HttpSecurity.

3.2. Konfiguracija za autorizaciju zahtjeva

Počinjemo s obavljanjem potrebnih konfiguracija za autorizaciju zahtjeva.

Ovdje dopuštamo anonimni pristup /prijaviti se tako da korisnici mogu provjeriti autentičnost. Ograničavajući / admin do UPRAVNIK uloge i osiguranje svega ostalog:

@Override zaštićena void konfiguracija (konačni HttpSecurity http) baca iznimku {http .csrf (). Disable () .authorizeRequests () .antMatchers ("/ admin / **"). HasRole ("ADMIN") .antMatchers ("/ anonimni * "). anonimno () .antMatchers (" / login * "). allowAll () .anyRequest (). authenticated () .and () // ...}

Imajte na umu da je redoslijed antMatchers () elementi su značajni - na prvom mjestu trebaju biti određenija pravila, a zatim općenitija.

3.3. Konfiguracija za prijavu obrasca

Dalje, proširujemo gornju konfiguraciju za prijavu i odjavu iz obrasca:

@Override zaštićena void konfiguracija (konačni HttpSecurity http) baca iznimku {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 () - prilagođena stranica za prijavu
  • loginProcessingUrl () - URL na koji treba poslati korisničko ime i lozinku
  • defaultSuccessUrl () - odredišna stranica nakon uspješne prijave
  • failureUrl () - odredišna stranica nakon neuspješne prijave
  • logoutUrl () - prilagođena odjava

4. Dodajte Spring Security web aplikaciji

Da bismo koristili gore definiranu Spring Security konfiguraciju, trebamo je priložiti web aplikaciji.

Koristit ćemo WebApplicationInitializer, tako da ne trebamo pružiti nijedan web.xml:

javna klasa AppInitializer implementira WebApplicationInitializer {@Override public void onStartup (ServletContext sc) {AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext (); root.register (SecSecurityConfig.class); sc.addListener (novi ContextLoaderListener (korijen)); sc.addFilter ("securityFilter", novi DelegatingFilterProxy ("springSecurityFilterChain")) .addMappingForUrlPatterns (null, false, "/ *"); }}

Imajte na umu da ovaj inicijalizator nije potreban ako koristimo aplikaciju Spring Boot. Pogledajte naš članak o sigurnosnoj automatskoj konfiguraciji Spring Boot za više detalja o načinu učitavanja sigurnosne konfiguracije u Spring Boot.

5. Proljetna sigurnosna XML konfiguracija

Pogledajmo i odgovarajuću XML konfiguraciju.

Cjelokupni projekt koristi Java konfiguraciju, tako da moramo uvesti XML konfiguracijsku datoteku putem Jave @Konfiguracija razred:

@Configuration @ImportResource ({"classpath: webSecurityConfig.xml"}) javna klasa SecSecurityConfig {public SecSecurityConfig () {super (); }}

I proljetna sigurnosna XML konfiguracija - webSecurityConfig.xml:

6. The web.xml

Prije uvođenja proljeća 4, koristili smo za konfiguriranje Spring Security konfiguracije u web.xml - samo je dodatni filtar dodan u standardni MVC opruge web.xml:

Proljeće zaštićena aplikacija springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain / * 

Filtar - DelegatingFilterProxy - jednostavno delegira na grah kojim upravlja proljeće - FilterChainProxy - koja i sama može imati koristi od cjelovitog upravljanja životnim ciklusom proljetnog graha i slično.

7. Obrazac za prijavu

Stranica obrasca za prijavu registrirat će se u Spring MVC koristeći izravan mehanizam za mapiranje imena pogleda na URL-ove bez potrebe za eksplicitnim kontrolerom između:

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

To, naravno, odgovara login.jsp:

Korisnik:
Zaporka:

The Proljetni obrazac za prijavu ima sljedeće relevantne artefakte:

  • prijaviti se - URL na kojem se OBJAVI obrazac za pokretanje postupka provjere autentičnosti
  • Korisničko ime - korisničko ime
  • zaporka - lozinka

8. Daljnja konfiguracija proljetne prijave

Ukratko smo razgovarali o nekoliko konfiguracija mehanizma za prijavu kada smo gore predstavili Spring Security Configuration - idemo sada u neke detalje.

Jedan od razloga za nadjačavanje većine zadanih vrijednosti u Spring Securityu je sakriti činjenicu da je aplikacija zaštićena Spring Securityom i minimiziranje informacija koje potencijalni napadač zna o aplikaciji.

Potpuno konfiguriran, element za prijavu izgleda ovako:

@Override zaštićena void konfiguracija (HttpSecurity http) baca iznimku {http.formLogin () .loginPage ("/ login.html") .loginProcessingUrl ("/ perform_login") .defaultSuccessUrl ("/ homepage.html", true) .failureUrl (true) "/login.html?error=true")}

Ili odgovarajuća XML konfiguracija:

8.1. Stranica za prijavu

Dalje, pogledajmo kako možemo konfigurirati prilagođenu stranicu za prijavu pomoću metoda loginPage ():

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

Ili putem XML konfiguracije:

login-page = '/ login.html'

Ako to ne odredimo, Spring Security generirat će vrlo osnovni obrazac za prijavu na /prijaviti se URL.

8.2. URL POST-a za prijavu

Zadani je URL na kojem će proljetna prijava POSTITI da pokrene postupak provjere autentičnosti /prijaviti se što je nekad bilo / j_spring_security_check prije proljetne sigurnosti 4.

Možemo koristiti loginProcessingUrl metoda za nadjačavanje ovog URL-a:

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

Ili putem XML konfiguracije:

prijava-obrada-url = "/ perform_login"

Dobar razlog za nadjačavanje ovog zadanog URL-a je skrivanje činjenice da je aplikacija zapravo zaštićena Spring Securityom - te informacije ne bi trebale biti dostupne izvana.

8.3. Odredišna stranica o uspjehu

Nakon uspješnog postupka prijave, korisnik se preusmjerava na stranicu - koja je prema zadanim postavkama korijen web aplikacije.

To možemo poništiti putem defaultSuccessUrl () metoda:

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

Ili s XML konfiguracijom:

default-target-url = "/ početna stranica.html"

U slučaju da uvijek-koristi-zadani-cilj je postavljeno na true, tada je korisnik uvijek preusmjeren na ovu stranicu. Ako je taj atribut postavljen na false, tada će korisnik biti preusmjeren na prethodnu stranicu koju je želio posjetiti prije nego što se od njega zatraži autentifikacija.

8.4. Odredišna stranica o neuspjehu

Kao i kod stranice za prijavu, stranicu za neuspjeh prijave automatski generira Spring Security na /prijaviti se?pogreška prema zadanim postavkama.

Da bismo to poništili, možemo koristiti failureUrl () metoda:

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

Ili s XML-om:

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

9. Zaključak

U ovome Primjer proljetne prijave, konfigurirali smo jednostavan postupak provjere autentičnosti - razgovarali smo o Obrascu za prijavu Spring Security, sigurnosnoj konfiguraciji i nekim naprednijim dostupnim prilagodbama.

Provedbu ovog vodiča za proljećnu prijavu možete pronaći u projektu GitHub - ovo je projekt zasnovan na Eclipseu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.

Kada se projekt izvodi lokalno, primjeru HTML-a može se pristupiti na:

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